Spring + JPA EntityManager注入了服务和dao

时间:2016-11-23 09:23:08

标签: java spring jpa autowired

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

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

该服务中的dao为@Autowired,而EntityManager在Service和Dao中均被@Autowired注入。

通过这种方式,我保证在服务和dao中注入相同的EntityManager吗?

4 个答案:

答案 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实例。