Исключение Java - невозможно вызвать фиксацию, если autocommit = true

Я разрабатываю приложение с EJB, когда я делаю транзакцию в базе данных, я получаю следующую ошибку:

Могила: RAR5031:Системное исключение
javax.resource.spi.LocalTransactionException:
Не удается вызвать фиксацию, если autocommit=true

Ниже приведен код:

public boolean update(Person vo) {
    boolean r = false;
    try 
    {
        entityManager.getTransaction().begin();
        entityManager.merge(vo);            
        entityManager.getTransaction().commit();
        r = true;
    } catch (Exception e) 
    {
    } finally {
        return r;
    }
}

Если этот код не вызывается из EJB, не возникает ошибка. Я получаю ошибку только при вызове из EJB.


person user2076397    schedule 17.04.2015    source источник
comment
Если бы вы использовали декларативные транзакции, управляемые контейнером, вам не нужно было бы явно начинать и фиксировать транзакции. Все грязные задачи выполняет контейнер под капотом. Однако если вы заинтересованы в использовании программных транзакций по каким-то неясным причинам, вы можете использовать транзакции, управляемые bean-компонентом (внедрение интерфейсов javax.transaction.UserTransaction с использованием аннотации @Resource и запуск и фиксация транзакций явно/программно).   -  person Tiny    schedule 17.04.2015


Ответы (2)


Поместите эту аннотацию @TransactionManagement(TransactionManagementType.BEAN) в ваш сессионный компонент. Пример:

@TransactionManagement(TransactionManagementType.BEAN)
public class YourSessionBean ...
person Howard Wang    schedule 21.04.2015

Все методы EJB являются транзакционными по умолчанию. Обработка транзакций выполняется компонентом EJB, поэтому вам не нужно вызывать begin() и commit().

person René Winkler    schedule 17.04.2015
comment
если эти методы не вызываются, изменения не сохраняются. у вас есть другие идеи? - person user2076397; 17.04.2015