stackoverflow.com/q/25514361
я естьbatchEdit(List<E> entity)
это вызываетedit(E entity)
функция в цикле, в то время как каждый edit () имеет свою собственную транзакцию, поэтому неудачные правки не отменяют хорошие правки. У меня в настоящее время это реализовано так:
Опция 1
@Stateless
@TransactionManagement( value = TransactionManagementType.CONTAINER )
public class Service<E> {
@Resource
private SessionContext context;
@Override
@TransactionAttribute( value = TransactionAttributeType.REQUIRES_NEW )
public E edit( E entity ) {
//edit code
}
@Override
public List<E> bulkEdit( List<E> entities ) {
for(E entity : entities){
//case 1: Regular edit, Does not create a new transaction!
//edit(entity);
//case 2: Hacky edit, creates a new transaction
context.getBusinessObject( Service.class ).editPersistNulls( entity );
}
}
}
В соответствии сэто обсуждение потока,@TransactionAttribute
в моем случае 1 игнорируется, потому что он не пересекает границы EJB, поэтомуbatchEdit()
звонкиedit()
как будто это не было аннотировано. С использованиемcontext.getBusinessObject()
Функция в случае 2, чтобы получить ссылку на компонент, заставляет работать аннотацию TransactionManagement, но кажется действительно странным проходить через все это.
Вариант 2
Другой вариант, который у меня есть, - изменить транзакции, управляемые компонентом:
@TransactionManagement( value = TransactionManagementType.BEAN )
Но тогда я потерял бы «JPA Magic» и должен был управлять транзакциями везде. Я не думаю, что другие люди в моей команде захотят пройти через это, поэтому, если есть лучший или стандартный способ сделать это, любая оценка приветствуется.
Мы используем OpenJPA и EJB, но мы стараемся быть ближе к стандарту JPA.