2016-11-23 79 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實例。