Spring+JPA EntityManager 注入 service 和 dao

Posted

技术标签:

【中文标题】Spring+JPA EntityManager 注入 service 和 dao【英文标题】:Spring+JPA EntityManager injected in service and dao 【发布时间】:2017-04-07 05:19:36 【问题描述】:

我正在使用服务和 dao 使用 Spring + JPA(使用休眠作为 JPA 提供者)。

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

服务中的dao是@AutowiredEntityManager在Service和Dao中都注入了@Autowired

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

【问题讨论】:

@shazin : 如何将 JPA EntityManager bean 配置为单例或原型? 【参考方案1】:

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

也看这里:Doc

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

【讨论】:

重点是我有一个或多个负责持久化我的实体的道。我需要一个处理交易的服务。如果我在 daos 中这样做,我可能会在出现错误时进行脏事务。否则我该如何管理它? @Massimo 您只能在 DAO 类中使用 EntityManager,但在相同的服务方法中进行那些未来的 atominc dao 调用并使其具有事务性。查看***.com/questions/3886909/… 谢谢,这是我需要的,请更新您的答案,以便我标记为解决方案【参考方案2】:

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>

【讨论】:

【参考方案3】:

你试过@PersistenceContext注解

@PersistenceContext
private EntityManager entityManager;

查看link 了解更多信息。另请查看 here 以了解您使用此注释的所有可能选项。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Spring+JPA EntityManager 注入 service 和 dao的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot-------JPA——EntityManager构建通用DAO

如何使用spring注入JPA EntityManager

制作多个 EntityManager(Spring-Boot-JPA、Hibernate、MSSQL)

Spring boot + Hibernate + JPA 没有可用的事务性 EntityManager

spring boot配置spring-data-jpa的时候报错CannotCreateTransactionException: Could not open JPA EntityManager

如何使用 spring4+spring-data-jpa(hibernateJpaVendorAdapter)+multidatasource+one entityManager+jpaReposit