我在一些教程之后学习了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()
?
有什么好的做法?
答案 0 :(得分:5)
第一个是没有所有手动刷新和事务模糊的EJB方法,是规范的方法。默认情况下,单个EJB方法调用已计为单个完整事务。 EJB容器将在调用方法之前透明地开始事务,并在方法返回时提交事务(或者在从方法抛出应用程序异常时回滚)。
第二个例子中的手动冲洗是不必要的。通常,您只想在修改实体时使用em.flush()
(即使其成为"脏")并希望之后(间接)在其上执行SELECT
同样的交易。它很少见,但它有真实世界的使用案例,通常当你想要{parent}为脏实体的父母的SELECT
时。
第三个例子中的手动交易管理完全没必要。读完第一段后你应该已经意识到了。只有当您不使用JTA
但RESOURCE_LOCAL
时(通常在Java SE中不是Java EE),才需要手动事务管理。