【发布时间】:2016-04-16 13:47:01
【问题描述】:
我正在按照一些教程学习 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(),当persistene.xml 中未将验证策略设置为“AUTO”时使用,对吗?@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()吗?
有哪些好的做法?
【问题讨论】:
-
可以使用
javax.ejb.TransactionAttribute注解检查stackoverflow.com/a/6863264/916225 -
无状态 EJB 默认是事务性的。在代码中显式启动和提交事务正是无状态 bean 允许避免的。所以没有理由在代码中启动和提交事务。让容器为你做这件事。
标签: jpa jakarta-ee transactions ejb jta