JPA 和 EJB - 我什么时候需要使用事务?
JPA and EJB - When do I need to use transaction?
我正在按照一些教程学习 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()
?
有哪些好的做法?
第一个是没有所有手动刷新和事务模糊的 EJB 方法,是规范方法。默认情况下,单个 EJB 方法调用已计为单个完整事务。 EJB 容器将在调用方法之前透明地开始事务,并在方法 returns 时提交事务(或在方法抛出应用程序异常时回滚)。
第二个例子中的手动刷新是不必要的。通常,您只想在修改实体(即使其“变脏”)时使用 em.flush()
,然后希望在同一事务中(间接)对其执行 SELECT
。这种情况很少见,但在现实世界中有它的用例,通常是当你想要 SELECT
一个父级,其脏实体是其子级时。
第三个例子中的手动事务管理完全没有必要。阅读第一段后,您应该已经意识到这一点。仅当您不使用 JTA
,但使用 RESOURCE_LOCAL
时才需要手动事务管理(通常,在 Java SE 中而不是 Java EE 中)。
另请参阅:
- When is it necessary or convenient to use Spring or EJB3 or all of them together?
- JSF request scoped bean keeps recreating new Stateful session beans on every request?
我正在按照一些教程学习 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()
?
有哪些好的做法?
第一个是没有所有手动刷新和事务模糊的 EJB 方法,是规范方法。默认情况下,单个 EJB 方法调用已计为单个完整事务。 EJB 容器将在调用方法之前透明地开始事务,并在方法 returns 时提交事务(或在方法抛出应用程序异常时回滚)。
第二个例子中的手动刷新是不必要的。通常,您只想在修改实体(即使其“变脏”)时使用 em.flush()
,然后希望在同一事务中(间接)对其执行 SELECT
。这种情况很少见,但在现实世界中有它的用例,通常是当你想要 SELECT
一个父级,其脏实体是其子级时。
第三个例子中的手动事务管理完全没有必要。阅读第一段后,您应该已经意识到这一点。仅当您不使用 JTA
,但使用 RESOURCE_LOCAL
时才需要手动事务管理(通常,在 Java SE 中而不是 Java EE 中)。
另请参阅:
- When is it necessary or convenient to use Spring or EJB3 or all of them together?
- JSF request scoped bean keeps recreating new Stateful session beans on every request?