JPA和EJB - 我什么时候需要使用事务?

时间:2016-04-16 13:47:02

标签: jpa java-ee transactions ejb jta

我在一些教程之后学习了Java的持久性。

我正在使用Java EE 7和Payara服务器。

我注意到每个都使用不同的持久性方法。

示例:

  • 简单

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
        }
        public void remove(Book book) {
            em.remove(book);
        }
    }
    
  • flush(),当验证策略未设置为" AUTO"时使用此选项。在 persistene.xml 中,对吧?

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
            em.flush();
        }
        public void remove(Book book) {
            em.remove(book);
            em.flush();
        }
    }
    
  • 有交易

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            utx.begin();
            em.persist(book);
            utx.commit();
        }
        public void remove(Book book) {
            utx.begin();
            em.remove(book);
            utx.commit();
        }
    }
    

何时以及为何必须使用最后一个?

是否有必要在每种方法结束时使用em.close()

有什么好的做法?

1 个答案:

答案 0 :(得分:5)

第一个是没有所有手动刷新和事务模糊的EJB方法,是规范的方法。默认情况下,单个EJB方法调用已计为单个完整事务。 EJB容器将在调用方法之前透明地开始事务,并在方法返回时提交事务(或者在从方法抛出应用程序异常时回滚)。

第二个例子中的手动冲洗是不必要的。通常,您只想在修改实体时使用em.flush()(即使其成为"脏")并希望之后(间接)在其上执行SELECT同样的交易。它很少见,但它有真实世界的使用案例,通常当你想要{parent}为脏实体的父母的SELECT时。

第三个例子中的手动交易管理完全没必要。读完第一段后你应该已经意识到了。只有当您不使用JTARESOURCE_LOCAL时(通常在Java SE中不是Java EE),才需要手动事务管理。

另见: