@Stateful EJB 可以使用 PersistenceContextType.EXTENDED 在多个事务中重用同一个 EntityManager。这在实现会话范围时很有用。Spring对此有任何支持吗?
3 回答
是的,Spring 支持它。例如,请参见使用 PersistenceContextType EXTENDED 注入 PersistenceContext。
在Implementing DAOs based on plain JPA中有一个简短的讨论:
注解有一个可选的
@PersistenceContext
属性类型,默认为PersistenceContextType.TRANSACTION
. 此默认值是您接收共享EntityManager
代理所需要的。替代方案 ,PersistenceContextType.EXTENDED
是完全不同的事情:这会导致所谓的 extendedEntityManager
,它不是线程安全的,因此不能在并发访问的组件中使用,例如 Spring 管理的单例 bean。ExtendedEntityManagers
只应该用在有状态的组件中,例如,驻留在会话中,其生命周期EntityManager
不依赖于当前事务,而是完全取决于应用程序。
所以不,听起来 Spring 不支持它们。
Spring 有一个带有静态工厂方法的特殊类,用于创建扩展实体管理器。请参见ExtendedEntityManagerCreator
此外,如果您注入EntityManagerFactory
并调用createEntityManager(SynchronizationType.SYNCHRONIZED)
它,它将创建具有扩展持久性上下文的实体管理器(它不会在事务提交后自动分离实体)。