Spring+注入service和dao的JPA EntityManager
Spring+JPA EntityManager injected in service and dao
我正在使用服务和 dao 使用 Spring + JPA(使用 hibernate 作为 JPA 提供程序)。
我想在服务和 dao 中注入 JPA EntityManager
,服务管理事务,dao 管理对象持久性。
dao在服务中@Autowired
,EntityManager
在Service和Dao中都被注入,@Autowired
.
这样我能保证在 Service 和 dao 中注入相同的 EntityManager
吗?
你试过@PersistenceContext
注解
@PersistenceContext
private EntityManager entityManager;
您可以使用 @PersistenceContext 注入 EntityManager,这将注入由 Spring 管理的共享 EntityManager。
但我认为您也应该重新考虑让 EM 投入使用的方法 class。
也看这里:Doc
作为 OP 的评论更新:
您只能在 DAO classes 中拥有 EntityManager,但在相同的服务方法中进行那些将成为原子的 dao 调用并使其成为事务性的。查看 Two Dao atomic calls
EntityManager 被初始化为一个 Singleton bean,因此只要确保连接正确的 EntityManager bean 就不必担心,以防在应用程序中配置了 2 个或更多 bean。
@PersistenceContext(unitName = "<persistent-unit-name>")
private EntityManager entityManager;
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="persistenceUnitName" value="<persistent-unit-name>" />
...
</bean>
这是完全错误的方式,但是,
您所有的 EntityManager 实例都将使用 EntityManagerFactoryBean 创建。
如果您创建了这个@Bean,它并不能保证您拥有相同的 EntityManager 实例。
我正在使用服务和 dao 使用 Spring + JPA(使用 hibernate 作为 JPA 提供程序)。
我想在服务和 dao 中注入 JPA EntityManager
,服务管理事务,dao 管理对象持久性。
dao在服务中@Autowired
,EntityManager
在Service和Dao中都被注入,@Autowired
.
这样我能保证在 Service 和 dao 中注入相同的 EntityManager
吗?
你试过@PersistenceContext
注解
@PersistenceContext
private EntityManager entityManager;
您可以使用 @PersistenceContext 注入 EntityManager,这将注入由 Spring 管理的共享 EntityManager。 但我认为您也应该重新考虑让 EM 投入使用的方法 class。
也看这里:Doc
作为 OP 的评论更新: 您只能在 DAO classes 中拥有 EntityManager,但在相同的服务方法中进行那些将成为原子的 dao 调用并使其成为事务性的。查看 Two Dao atomic calls
EntityManager 被初始化为一个 Singleton bean,因此只要确保连接正确的 EntityManager bean 就不必担心,以防在应用程序中配置了 2 个或更多 bean。
@PersistenceContext(unitName = "<persistent-unit-name>")
private EntityManager entityManager;
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="persistenceUnitName" value="<persistent-unit-name>" />
...
</bean>
这是完全错误的方式,但是, 您所有的 EntityManager 实例都将使用 EntityManagerFactoryBean 创建。 如果您创建了这个@Bean,它并不能保证您拥有相同的 EntityManager 实例。