entitymanager
JPA规范定义了几种类型的EntityManagers / Persistence Context。 我们可以有:
- 扩展和事务范围的EntityManager,
- 容器管理或应用程序管理的EntityManager。
- JTA或本地资源EntityManager,
除了上述区别之外,我们还可以在其中存在EntityManager / Persistence Context的两个主要上下文– Java EE和Java SE 。 并非每个选项都适用于Java EE,并且并非每个选项都适用于Java SE。 在本文的其余部分中, 我将介绍Java EE环境 。
好的,因此在继续本文之前的主题之前(这是使用EntityManagerFactory手动创建的Java EE中EntityManager的行为),我们仅简要介绍一下上述EM类型。
扩展与事务范围
此功能告诉我们EntityManager的操作是否可能跨越多个事务。 默认情况下,使用事务性持久性上下文,这意味着当提交当前事务时,将清除所有更改,并分离所有受管实体。 扩展范围仅适用于有状态EJB。 这非常有意义,因为SFSB可以保存状态,因此不必终止一种业务方法就意味着结束事务。 使用SLSB的情况就不同了–我们有业务方法必须在业务方法完成时结束,因为在下一次调用中,我们不知道我们将以哪个EJB实例结束。 SLSB仅允许使用事务范围的EntityManager。 您可以控制在EntityManager注入期间EntityManager是扩展的还是事务的:
@PersistenceContext(type=javax.persistence.PersistenceContextType.EXTENDED)
EntityManager em;
默认情况下为javax.persistence.PersistenceContextType.TRANSACTION
。 附带说明–使用扩展的EntityManager可能使您可以创建一些有趣的解决方案; 看看具有事务性保存方法技巧的 Adam Bien的无事务bean 。 他使用这种方法使事务开始和结束时自动清除所有更改(并且他实际上通过调用特殊的人工方法来做到这一点。)仅在容器管理的EntityManagers的情况下才允许扩展和事务范围的PersistenceContext。
容器管理与应用程序管理
在大多数Java EE应用程序中,您只是使用@PersistenceContext注入EntityManager,如下所示:
@PersistenceContext
EntityManager em;
实际上,这意味着您要让容器为您的EntityManager注入 (容器是在后台从EntityManagerFactory创建的。)这意味着EntityManager是由容器管理的。 另外,您可以从EntityManagerFactory自己创建EntityManager。 您可以通过注入获得它:
@PersistenceUnit
EntityManagerFactory emf;
然后,要获取EntityM