2015-04-17 4 views
0

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

Grave: RAR5031:System Exception
javax.resource.spi.LocalTransactionException:
Can't call commit when 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.

+1

Если бы использовать декларативный управляемый контейнер транзакции, вам не нужно будет явно начинать и совершать сделки. Все грязные задачи обрабатываются контейнером под капотом. Если бы вы, однако, были заинтересованы в использовании программных транзакций по некоторым неясным причинам, тогда вы могли бы использовать [управляемые транзакциями транзакции] (https://docs.oracle.com/javaee/7/tutorial/transactions004.htm) (вводя 'javax.transaction.UserTransaction', используя аннотацию' @ Resource', и запускать и совершать транзакции явно/программно). – Tiny

ответ

1

Поделитесь этой аннотацией @TransactionManagement(TransactionManagementType.BEAN) на своем сеансе. Пример:

@TransactionManagement(TransactionManagementType.BEAN) 
public class YourSessionBean ... 
1

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

+0

Если вы не используете эти методы, не пытайтесь делать изменения. у вас есть другие идеи? – user2076397

Смежные вопросы