如何解决挂毯`EntityManager`与`EntityManagerManager`
在Tapestry中,主要有两种获取EntityManager
实例的方法:
- 通过直接注入
EntityManager
:@Inject @PersistenceContext(unitName = MyPersistenceUnit) private EntityManager entityManager;
- 通过使用
EntityManagerManager
(也被注入):EntityManager entityManager = entityManagerManager.getEntityManager(MyPersistenceUnit);
EntityManagerManager
在其Javadoc中指出,每个线程管理一个EntityManager
:
为当前线程管理
EntityManager
。一个EntityManager
根据需要创建,并在最后关闭 每个请求。此服务的实现是按线程执行的。
这是否也适用于直接注入EntityManager
?因此,例如,如果我在一个线程中启动事务,就像这样:
entityManager.getTransaction().begin();
在另一个线程中EntityManager
的事务是否处于非活动状态-即entityManager.getTransaction().isActive()
对于其他也注入了EntityManager
的线程是否为假?
更一般而言,我对应该使用什么 感到好奇。一个人与另一个人有什么区别/优势?
解决方法
这两种方法是相同的,您可以使用具有相同保证的任何方法:
EntityManager
始终是每个线程的实例,线程之间不共享任何内容。每个EntityManager
在每个请求结束时都会被丢弃/关闭(调用PerthreadManager#cleanup()
方法时)。
EntityManagerManager
用作EntityManagerObjectProvider
中的源,它生成EntityManager
的实例,因此您可以简单地编写@Inject EntityManager
而不用从管理器中明确获取它。>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。