使用jpa2 / eclipselink的适当DAO结构是什么?

时间:2010-09-15 02:56:05

标签: orm jpa dao eclipselink jpa-2.0

我有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;
}

这种方式创建实例是标准的,仍然维护单例连接/实体管理器。 另一方面,我想知道是否需要首先单独使用ems? 优点是多个ems遇到锁定问题(不使用em.lock())。

有任何反馈意见吗?任何使用JPA2和eclipselink演示DAO的真实世界或教程代码?

2 个答案:

答案 0 :(得分:3)

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

  

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

我完全赞同上述观点。

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

以下是一些可能有助于确定适合您案例的链接:

如果你真的想要采用DAO方式,你可以:

答案 1 :(得分:1)

您可以考虑使用Spring 3.只需按照their documentation进行简洁设计即可。