我正在使用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