EntityManager CDI的公用库

时间:2019-03-25 12:33:46

标签: jpa cdi entitymanager genericdao

我在公共库中有一个公共的通用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方法)

2 个答案:

答案 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