Spring+注入service和dao的JPA EntityManager

Spring+JPA EntityManager injected in service and dao

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

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

dao在服务中@AutowiredEntityManager在Service和Dao中都被注入,@Autowired.

这样我能保证在 Service 和 dao 中注入相同的 EntityManager 吗?

你试过@PersistenceContext注解

@PersistenceContext
private EntityManager entityManager;

查看此 link for more info. Also look here 以了解使用此注释的所有可能选项。

您可以使用 @PersistenceContext 注入 EntityManager,这将注入由 Spring 管理的共享 EntityManager。 但我认为您也应该重新考虑让 EM 投入使用的方法 class。

也看这里:Doc

作为 OP 的评论更新: 您只能在 DAO classes 中拥有 EntityManager,但在相同的服务方法中进行那些将成为原子的 dao 调用并使其成为事务性的。查看 Two Dao atomic calls

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>

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