我正在使用Spring + JPA(使用hibernate作为JPA提供程序)使用服务和dao。Spring + JPA EntityManager注入服务和道
我想在服务和dao中注入JPA EntityManager
,管理事务的服务和管理对象持久性的dao。
该服务中的道路为@Autowired
,EntityManager
注入Service和Dao中,其中@Autowired
。
以这种方式,我保证在服务和道路中注入相同的EntityManager
?
我正在使用Spring + JPA(使用hibernate作为JPA提供程序)使用服务和dao。Spring + JPA EntityManager注入服务和道
我想在服务和dao中注入JPA EntityManager
,管理事务的服务和管理对象持久性的dao。
该服务中的道路为@Autowired
,EntityManager
注入Service和Dao中,其中@Autowired
。
以这种方式,我保证在服务和道路中注入相同的EntityManager
?
您可以使用@PersistenceContext注入EntityManager,它将注入由Spring管理的共享EntityManager。 但我认为你应该重新考虑你在服务类中使用EM的方法。
也看这里:Doc
由于OP的评论更新: 你可以只的EntityManager在DAO类,但让那些将要atominc道调用相同的服务方法,并使其transactional.Check出来Two Dao atomic calls
关键是我可以说一个或更多的负责坚持我的实体。我需要一个处理交易的服务。如果我这样做,我可以在发生错误时进行肮脏的交易。我如何管理它呢? – Massimo
@Massimo你只能在DAO类中拥有EntityManager,但是要使用相同的服务方法进行atominc dao调用,并使其成为事务处理。请参阅http://stackoverflow.com/questions/3886909/where-should-transactional-be -place-service-layer-or-dao – grsdev7
感谢这就是我所需要的,请更新您的答案,以便我将其标记为解决方案 – Massimo
EntityManager被初始化为一个Singleton bean,因此只要确保连接了正确的EntityManager bean,以防在应用程序中配置了两个或更多的EntityManager 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实例。
@shazin:如何配置JPA EntityManager bean为单例或原型? – grsdev7