一个简单的银行应用程序:
注意事项:
- 使用 Spring+JPA 并以 EclipseLink 作为 JPA 提供者实现
- EntityManager 使用 @PersistenceContext 注入(inject) BaseDaoImpl
- DAO Autowiring 到 Service bean 中
- 在服务方法中使用@Transactional 注解
问题:
- 每个 DAO 是否都有自己的 EntityManager 实例,还是共享该实例?
- 如果它们是单独的实例,事务如何进行?
- 如果是共享实例,连接何时关闭?在应用程序关闭时?这是否意味着,无论 DAO/实体的数量有多少,整个应用程序只有一个连接,并且它在应用程序的生命周期内保持打开状态?
最佳答案
使用 @PersistenceContext
注入(inject)的 EntityManager
实例是一个代理,它将实际工作委托(delegate)给与当前事务关联的 EntityManager
。
换句话说,它的工作原理如下:
- 当您进入
@Transactional
范围时,将创建新事务并与当前线程关联 - 当您在 DAO 中调用
EntityManager
的方法时,该调用将委托(delegate)给与当前事务关联的EntityManager
(新的EntityManager
将如果不存在则创建) - 当您离开
@Transactional
范围时,事务将被提交,并且与其关联的EntityManager
将被关闭
关于java - Spring+JPA 集成的实际工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361325/