entitymanager,交易中的交易

时间:2014-05-14 14:01:09

标签: jpa transactions entitymanager

我有这样的代码:

   public void createTerminal(TerminalDo terminalDo) {
        final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
        final EntityManager em = emf.createEntityManager();
        EntityTransaction etx = null;
        try {
            etx = em.getTransaction();
            etx.begin();

            // persist method make the passed Object stored in the persistence
            // context
            em.persist(terminalDo);

            etx.commit();
        } catch (Exception e) {
            if (etx != null && etx.isActive())
                etx.rollback();
            e.printStackTrace();
        } finally {
            em.close();
        }
   }

这是一种交易方法。 我不知道是否可以创建另一个调用此事务处理方法的事务方法, 然后将实体管理的事务嵌套到另一个事务中, 这是一个好习惯吗?

       public void makeAllThat(TerminalDo terminalDo, ApplicationDo applicationDo) {
            final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
            final EntityManager em = emf.createEntityManager();
            EntityTransaction etx = null;
            try {
                etx = em.getTransaction();
                etx.begin();

                createTerminal(terminalDo);
                createApplication(applicationDo);
                //do many other transactions...
                .....

                etx.commit();
            } catch (Exception e) {
                if (etx != null && etx.isActive())
                    etx.rollback();
                e.printStackTrace();
            } finally {
                em.close();
            }
       }

1 个答案:

答案 0 :(得分:1)

您要求的是称为嵌套交易。仅JPA没有具体说明。持久性单元可以有两种类型:RESOURCE_LOCAL(您使用EntityTransaction时的情况)和JTA。 JTA也被称为not requiring nested transactions。但是你的情况是RESOURCE_LOCAL,AFIK依赖于你的JDBC驱动程序,数据库和数据库引擎。

重要说明:您展示的示例是并行事务的示例,因为您使用EntityManager createApplication()EntityManagerFactory.createEntityManager()' is independent of each other. In your case, if createTerminal()`创建的每个fails,实例都将拥有其事务提交(请测试并在评论中确认)!

通常你没有嵌套事务,我建议使用JTA事务(使用支持声明式事务的框架,如Spring或EJB),因为它现在确实是一个标准。