JPA:多笔交易

时间:2012-01-25 13:17:12

标签: java jpa transactions eclipselink

我正在尝试使用相同的事务实体进行2次不同的DB调用。我知道我可以在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 个答案:

答案 0 :(得分:2)

这是因为transacton-type设置为RESOURCE_LOCAL。 在这种情况下,您必须创建一些应该处理SingleTonEntityManager的{​​{1}}个类。

答案 1 :(得分:0)

奇。这应该工作。您使用的JPA提供商是什么?也许启用日志记录以查看正在发生的事情。

答案 2 :(得分:-1)

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是你自己的工厂