jpa2/eclipselink 的合适 DAO 结构是啥?

Posted

技术标签:

【中文标题】jpa2/eclipselink 的合适 DAO 结构是啥?【英文标题】:What's an appropriate DAO structure with jpa2/eclipselink?jpa2/eclipselink 的合适 DAO 结构是什么? 【发布时间】:2011-04-12 11:26:58 【问题描述】:

我有 JPA 实体,需要用它们执行逻辑。到目前为止,一个巨大的静态数据库类完成了这项工作。这很丑,因为每个公共接口方法都有一个使用 EntityManager 的私有等效方法来执行事务。但我也可以解决这个问题! 但是我想知道这是否是一个合适的设计,特别是因为该类负责许多事情。 毫不奇怪,我在网上找到的真实项目的代码并不容易理解(我不妨重新考虑我的代码)。 代码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。 另一方面,我想知道首先是否需要单例 em? 优点是我遇到了多个 em 锁定问题(不使用 em.lock())。

有什么反馈吗?是否有任何真实世界或教程代码使用 JPA2 和 eclipselink 演示 DAO?

【问题讨论】:

【参考方案1】:

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

Adam 说他只遇到过很少的项目切换数据库供应商的情况,也没有遇到持久性转移到与 RDBM 不同的事情的情况。为什么你要为一件不太可能发生的事情付出更多?有时,当它发生时,一个更简单的解决方案可能已经为自己付出了代价,而且重写一个组件可能会变得更简单。

我完全同意上述观点。

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

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

Re: JPA DAO in Desktop Application Using the Java Persistence API in Desktop Applications Eclipselink in J2SE RCP Applications Developing Applications Using EclipseLink JPA (ELUG) An interesting debate about JPA and the DAO

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

使用Spring JPA support, 使用一些通用 DAO 库,例如 generic-dao、krank、DAO Fusion、 推出您自己的通用 DAO。

【讨论】:

【参考方案2】:

您可以考虑使用 Spring 3。只需关注 their documentation 即可获得简洁的设计。

【讨论】:

以上是关于jpa2/eclipselink 的合适 DAO 结构是啥?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0 Eclipse 链接

在 JSF 和 JPA 项目中使用 POJO 作为模型,对吗?

处理服务或 DAO 中的聚合

Java CRUD DAO持久性设计

在保存、更新和删除时发出事件的 DAO

何时是调用 DBEngine.Idle dbRefreshCache 的合适时间?