JPA: несколько транзакций - PullRequest
       38

JPA: несколько транзакций

3 голосов
/ 25 января 2012

Я пытаюсь сделать 2 разных вызова БД с одной и той же сущностью транзакции.Я знаю, что могу сделать оба запроса между begin() и commit(), но я пробую это только в образовательных целях.

EntityTransaction transaction = em.getTransaction();
EventService eventService = new EventService();
transaction.begin();
Event currentEvent = eventService.read(eventId);
transaction.commit();

if (currentEvent != null){
    CommentService commentService = new CommentService();
    transaction.begin();
    commentList = commentService.getList(1, id, 50);
    transaction.commit();
}

Этот фрагмент кода выдает:

Описание исключения: транзакция в настоящее время активна

, что нормально, если я пытаюсь begin() к уже открытой транзакции.

Правильно ли исключить вторую transaction.begin() и просто использовать commit() всякий раз, когда мне нужно работать с БД?

LE: Я использую EclipseLink и RESOURCE_LOCAL

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Это происходит потому, что для transacton-type установлено значение RESOURCE_LOCAL. В этом случае вы должны создать несколько классов SingleTon, которые должны обрабатывать EntityManager и EntityTransaction.

0 голосов
/ 25 апреля 2017
private static EntityManager picassoEm = null;

public static synchronized boolean insertToDB(EntityObject eobj) {
    try {
        if (picassoEm == null) {
            picassoEm = JPAUnit.getEntityManagerFactoryPicasso().createEntityManager();

        }
        EntityTransaction eT = picassoEm.getTransaction();
        eT.begin();
        picassoEm.persist(eobj);
        eT.commit();            
        return true;
    } catch (Exception ex) {
        ex.printStackTrace();
        return false;
    }

}

JPAUnit - это сама фабрика

0 голосов
/ 25 января 2012

Одд. Это должно работать. Какой провайдер JPA вы используете? Возможно, включите ведение журнала, чтобы увидеть, что происходит.

...