【发布时间】:2016-02-06 19:18:24
【问题描述】:
我们有一个使用 JPA 但不使用 CDI 或 EJB 的大型 pre-JEE5 应用程序,因此 EntityManager 不会被注入 DAO,而是使用
Persistence.createEntityManagerFactory(...).createEntityManager()
,然后存储在ThreadLocal变量中。这个获取实体管理器的脏活被封装在DAO使用的实用程序类EntityManagerUtil中,因此业务逻辑不处理低级实体管理器的东西;另外,这个应用程序使用aspectj和annotations来创建事务边界,事务方面使用与DAO相同的EntityManagerUtil类来获取实体管理器来创建事务。
我们现在需要将此应用程序迁移到 Wildfly 9。它不能开箱即用,因为 aspectj 不能在 wildfly 中部署,所以我们创建和提交事务的方面不适用,并且没有任何效果。为了让它工作,我们需要将EntityManager注入DAO并使用EJB或CDI事务机制,但这似乎也意味着我们需要将DAO注入到任何使用它们的类中,然后将这些类注入到更高的类中在调用层次结构上,依此类推(好像该类是使用“new”创建的,它不受容器管理,并且没有任何东西注入其中)。由于应用程序很大,而且我们到处都有对象实例化,这似乎是不可能完成的任务。
所以我想知道是否可以在 DAO 和更低级别隔离注入使用,因此使用 DAO 的调用者代码不会改变,并且仍会使用“new”创建 DAO,但 DAO 将使用注入的实体管理器和CDI 还是 EJB 事务?
欢迎提出建议,谢谢!
【问题讨论】:
-
在更高层次上,注入manger的时候,能不能保存在一个线程本地?稍后,新的 DAO 可以从本地线程中查找。
-
您能否详细说明您的
EntityManagerUtil是如何使用的?您很可能必须(由服务器)完全管理,或者您必须将容器排除在外。
标签: jakarta-ee dependency-injection transactions cdi wildfly