gpt4 book ai didi

orm - jpa2/eclipselink 合适的 DAO 结构是什么?

转载 作者:行者123 更新时间:2023-12-01 20:23:13 25 4
gpt4 key购买 nike

我有 JPA 实体并且需要用它们执行逻辑。到目前为止,一个巨大的静态数据库类完成了这项工作。它很丑陋,因为每个公共(public)接口(interface)方法都有一个使用 EntityManager 的私有(private)等效方法来执行事务。但我也可以通过静态 em 来解决这个问题!然而我想知道这是否是一个合适的设计,特别是因为该类负责很多事情。毫不奇怪,我在网上找到的真实项目的代码并不容易理解(那么我最好还是保留我的代码)。代码here很容易理解,尽管可能过于通用?无论如何,在 JDBC 之上。然而,富有洞察力的是,为什么要为 DAO 使用工厂和单例?

我想按如下方式单例化 em 实例:

private static final Map<String, EntityManager> ems = new HashMap<String, EntityManager>();
private final EntityManager em;
private final EntityManagerFactory emf;

public void beginTransaction() {
em.getTransaction().begin();
}

public void commitTransaction() {
em.getTransaction().commit();
}

public Database(final String persistenceUnitName) {
if(ems.containsKey(persistenceUnitName)){
em = ems.get(persistenceUnitName);
}else{
ems.put(persistenceUnitName, em = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager());
}
emf = em.getEntityManagerFactory();
this.persistenceUnitName = persistenceUnitName;
}

这种实例创建方式是标准的,仍然维护单例 Connection/EntityManager。另一方面,我想知道是否有必要首先将 ems 单例化?优点是使用多个 em 时我会遇到锁定问题(不使用 em.lock())。

有任何反馈吗?有任何使用 JPA2 和 eclipselink 演示 DAO 的实际代码或教程代码吗?

最佳答案

就我个人而言,我没有看到使用 Domain Store 屏蔽 EntityManager (这是 DAO 模式的实现)的附加值。我会直接从服务使用它,除非有可能从 JPA 切换。但是,引用An interesting debate about JPA and the DAO :

Adam said that he met only very few cases in which a project switched the database vendor, and no cases in which the persistence moved to a different thing than a RDBMs. Why should you pay more for a thing that it's unlikely to happen? Sometimes, when it happens, a simpler solution might have paid for itself and it might turn out to be simpler to rewrite a component.

我完全同意以上观点。

无论如何,仍然存在的问题是 EntityManager 的生命周期,答案很大程度上取决于应用程序的性质(Web 应用程序、桌面应用程序)。

以下一些链接可能有助于确定适合您情况的链接:

如果你真的想走 DAO 之路,你可以:

关于orm - jpa2/eclipselink 合适的 DAO 结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com