2016-11-23 77 views
1

我正在使用Spring + JPA(使用hibernate作为JPA提供程序)使用服务和dao。Spring + JPA EntityManager注入服务和道

我想在服务和dao中注入JPA EntityManager,管理事务的服务和管理对象持久性的dao。

该服务中的道路为@AutowiredEntityManager注入Service和Dao中,其中@Autowired

以这种方式,我保证在服务和道路中注入相同的EntityManager

+0

@shazin:如何配置JPA EntityManager bean为单例或原型? – grsdev7

回答

2

您可以使用@PersistenceContext注入EntityManager,它将注入由Spring管理的共享EntityManager。 但我认为你应该重新考虑你在服务类中使用EM的方法。

也看这里:Doc

由于OP的评论更新: 你可以只的EntityManager在DAO类,但让那些将要atominc道调用相同的服务方法,并使其transactional.Check出来Two Dao atomic calls

+0

关键是我可以说一个或更多的负责坚持我的实体。我需要一个处理交易的服务。如果我这样做,我可以在发生错误时进行肮脏的交易。我如何管理它呢? – Massimo

+0

@Massimo你只能在DAO类中拥有EntityManager,但是要使用相同的服务方法进行atominc dao调用,并使其成为事务处理。请参阅http://stackoverflow.com/questions/3886909/where-should-transactional-be -place-service-layer-or-dao – grsdev7

+0

感谢这就是我所需要的,请更新您的答案,以便我将其标记为解决方案 – Massimo

0

你试过@PersistenceContext注释

@PersistenceContext 
private EntityManager entityManager; 

看看这个link获取更多信息。您还可以看看here,了解您使用此注释的所有可能选项。

1

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> 
2

它完全错误的方式,但 所有EntityManager实例将与EntityManagerFactoryBean创建。 如果您创建了这个@Bean,它并不保证您拥有相同的EntityManager实例。