java - Spring+JPA 集成的实际工作原理

标签 java spring jpa

一个简单的银行应用程序: enter image description here

注意事项:

  • 使用 Spring+JPA 并以 EclipseLink 作为 JPA 提供者实现
  • EntityManager 使用 @PersistenceContext 注入(inject) BaseDaoImpl
  • DAO Autowiring 到 Service bean 中
  • 在服务方法中使用@Transactional 注解

问题:

  1. 每个 DAO 是否都有自己的 EntityManager 实例,还是共享该实例?
  2. 如果它们是单独的实例,事务如何进行?
  3. 如果是共享实例,连接何时关闭?在应用程序关闭时?这是否意味着,无论 DAO/实体的数量有多少,整个应用程序只有一个连接,并且它在应用程序的生命周期内保持打开状态?

最佳答案

使用 @PersistenceContext 注入(inject)的 EntityManager 实例是一个代理,它将实际工作委托(delegate)给与当前事务关联的 EntityManager

换句话说,它的工作原理如下:

  • 当您进入@Transactional范围时,将创建新事务并与当前线程关联
  • 当您在 DAO 中调用 EntityManager 的方法时,该调用将委托(delegate)给与当前事务关联的 EntityManager(新的 EntityManager 将如果不存在则创建)
  • 当您离开 @Transactional 范围时,事务将被提交,并且与其关联的 EntityManager 将被关闭

关于java - Spring+JPA 集成的实际工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361325/

相关文章:

java - 在 Hibernate 中将对象从查询转换为其他类?

java - 如何等待 ThreadPoolExecutor 的线程退出?

java - java中如何让按钮循环运行

java - hibernate 5.2.17 : ORA-01797: this operator must be followed by ANY or ALL

java - 从maven spring mvc创建表时出现问题

java - Spring CrudRepository,Webservice,返回带有特定字符串的json对象

java - Mockito 的 eq 调用不应该等于吗?

java - 矩阵求幂方法JAVA

java - Spring Data JPA - 如何通过 child ID 获取 parent ?

spring - Spring集成异常: How to log but not intercept