【问题标题】: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?

【问题讨论】:

    标签: orm jpa dao eclipselink jpa-2.0


    【解决方案1】:

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

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

    我完全同意上述观点。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-27
        相关资源
        最近更新 更多