1

我在公共库中有一个通用的通用 DAO。我希望在每个使用此 DAO 的模块中使用自己的持久性 UNIT 进行初始化

public abstract class GenericDao implements IGenericDao {

@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;

和其他模块

public class CarDao extends GenericDao{

我有很多项目都在使用这个通用 DAO,但每个项目都有自己的持久性单元。

Persitence 单位在使用公共库的项目之后有所不同

关键是我不能在每个微服务中使用带有抽象 getEntityManager 的 POO,因为在公共项目中,我们有一个所有微服务通用的历史 DAO,对于每个微服务,我都必须检索从微服务注入的 entityManager

我做错了还是做得好?以及如何在每个项目中设置持久单元?(每个项目都有很多 DAO,我不想每次 CRUD 方法都重复)

4

2 回答 2

1
@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;

这应该在每个具体类中完成,抽象类应该使用

getEntityManager().doSomething(entity)

吸气剂getEntityManager()是抽象的。

恕我直言,这是一种设计气味,EntityManager已经是一种抽象,封装它没有任何好处。

[编辑]

关于“工厂”方式,CDI 中动态注入资源的方式是使用producer methods.

您可以创建一个返回EntityManager实例的方法,该实例将EntityManagerFactory根据持久性单元名称动态解析(参见此处的示例)。

请注意,这是一个非常糟糕的主意,因为entityManager范围通常绑定到事务之一,让容器向您注入entityManager实例保证范围将被正确处理(由容器)。这种方法唯一可行的配置是当您想要“管理应用程序”时entityManager

注意:请注意,给定的示例将为EntityManageFactory每次注入实例化一个新实例,根据您使用它的方式,这可能真的是灾难性的(EntityManageFactory应该为所有应用程序创建一次)

在继续之前,请务必了解EntityManager 生命周期。

于 2019-03-25T13:13:51.430 回答
0

谢谢你的建议事实上我在我的genericDao中完全愚蠢我只是简单地说

public abstract class GenericDao implements IGenericDao {


@PersistenceContext
private EntityManager entityManager; 

由于我们只有一个 PersistentUnit,它会被自动注入....

太容易了!

然后我可以在所有 DAO 中使用 @PersistentContext ,或者从它们的父级 IGenericDao 简单且最好地调用 getEntityManager

于 2019-04-02T08:00:33.853 回答