我正在使用 Spring + JPA (使用hibernate作为JPA提供程序)使用服务和dao。
我想在服务和dao中注入JPA EntityManager
,管理事务的服务和管理对象持久性的dao。
该服务中的dao为@Autowired
,而EntityManager
在Service和Dao中均被@Autowired
注入。
通过这种方式,我保证在服务和dao中注入相同的EntityManager
吗?
答案 0 :(得分:3)
您可以使用@PersistenceContext注入EntityManager,这将注入由Spring管理的共享EntityManager。 但我认为你应该重新考虑你在服务类中使用EM的方法。
另见:Doc
OP的评论更新: 你可以只在DAO类中使用EntityManager,但是在同一服务方法中进行那些原子dao调用并使其成为事务性的。查看Two Dao atomic calls
答案 1 :(得分:1)
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>
答案 2 :(得分:0)
您是否尝试过@PersistenceContext
注释
@PersistenceContext
private EntityManager entityManager;
有关详细信息,请查看此here。另请查看Jedi mentioned以了解此注释的所有可能选项。
答案 3 :(得分:0)
完全错误的方式,但是, 所有EntityManager实例都将使用EntityManagerFactoryBean创建。 如果您已创建此@Bean,则不保证您具有相同的EntityManager实例。