【问题标题】:Spring+JPA EntityManager injected in service and daoSpring+JPA EntityManager 注入 service 和 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 配置为单例或原型?

标签: java spring jpa autowired


【解决方案1】:

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

也看这里:Doc

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

【讨论】:

  • 重点是我有一个或多个负责持久化我的实体的道。我需要一个处理交易的服务。如果我在 daos 中这样做,我可能会在出现错误时进行脏事务。否则我该如何管理它?
  • @Massimo 您只能在 DAO 类中使用 EntityManager,但在相同的服务方法中进行那些未来的 atominc dao 调用并使其具有事务性。查看stackoverflow.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 实例。

      【讨论】:

        猜你喜欢
        • 2015-05-02
        • 1970-01-01
        • 2015-08-25
        • 2016-06-07
        • 2014-10-06
        • 2015-08-11
        • 2011-01-26
        • 2016-08-06
        • 1970-01-01
        相关资源
        最近更新 更多