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是@Autowired
,EntityManager
在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
制作多个 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