我在公共库中有一个公共的通用DAO。我想在每个使用此DAO进行初始化的模块中使用自己的持久性UNIT
public abstract class GenericDao implements IGenericDao {
@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;
和其他模块
public class CarDao extends GenericDao{
我有很多项目都在使用这种通用DAO,但是每个项目都有自己的持久性单元。
在使用公共库的项目之后,持久性单元有所不同
关键是我不能在每个微服务中使用抽象的getEntityManager注入的POO,因为在共同的项目中,我们具有所有微服务都具有的历史DAO,对于每个微服务我都必须检索从微服务注入的entityManager
我做错了还是做得好?以及如何在每个项目中设置持久性单元? (每个项目都有很多DAO,并且我不想每次都重复使用CRUD方法)
答案 0 :(得分:1)
\\2
这应该在每个具体的类中完成,抽象的应该使用
来实现具体的操作@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;
吸气剂getEntityManager().doSomething(entity)
是抽象的。
天哪,这是一种设计上的味道,getEntityManager()
已经是一种抽象了,您没有什么要封装的。
[编辑]
关于“工厂”方法,CDI中动态注入资源的方法是使用EntityManager
。
您可以这样创建一个返回producer methods
实例的方法,该实例将根据持久性单元名称动态解析EntityManager
(请参见示例here)。
请注意,这是一个非常糟糕的主意,因为EntityManagerFactory
范围通常绑定到事务之一,让容器向您注入entityManager
实例可确保该范围将被正确处理(容器)。使用此方法的唯一可行配置是当您希望“应用程序托管” entityManager
NB:请注意,给定示例将为每次注射实例化一个新的entityManager
实例,根据您的使用方式,它可能确实是灾难性的(EntityManageFactory
应该为所有应用程序创建一次)
在继续操作之前,请务必注意EntityManager lifecycle。
答案 1 :(得分:0)
谢谢你们的建议,实际上我只是简单地说了我的我的genericDao
arr2 = [[0, 4, 3, 0, 0, 2, 0], [0, 4, 3, 0, 0, 2, 0], [0, 4, 3, 0, 0, 2, 0], [0, 5, 3, 0, 0, 2, 0], [0, 5, 3, 0, 0, 2, 0], [0, 5, 3, 0, 0, 2, 0]]
由于我们只有一个PersistentUnit,它将被自动注入。...
非常简单!
然后我可以在所有DAO中使用@PersistentContext,或者简单地从其父级IGenericDao最好调用getEntityManager