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

JPA and EJB - When do I need to use transaction?

我正在按照一些教程学习 Java 中的坚持。

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

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

示例:

什么时候以及为什么我必须使用最后一个?

是否有必要在每个方法的最后使用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?