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.

Ответы на вопрос(2)

Ваш ответ на вопрос