Orm 什么';使用jpa2/eclipselink是否是合适的DAO结构?

Orm 什么';使用jpa2/eclipselink是否是合适的DAO结构?,orm,jpa,dao,eclipselink,jpa-2.0,Orm,Jpa,Dao,Eclipselink,Jpa 2.0,我有JPA实体,需要对它们执行逻辑。直到现在,一个巨大的静态数据库类完成了这项工作。这很难看,因为每个公共接口方法都有一个使用EntityManager执行事务的私有等价物。但是我也可以用一个静态em来解决这个问题! 然而,我想知道这是否是一个合适的设计,特别是因为这个类负责很多事情。 毫不奇怪,我在网上找到的真实项目的代码并不容易理解(那时我还不如用我的代码来记忆)。 代码很容易理解,尽管可能过于通用?无论如何,在JDBC之上。然而,有见地的是,为什么DAO使用工厂和单例呢 我对em实例进行了

我有JPA实体,需要对它们执行逻辑。直到现在,一个巨大的静态数据库类完成了这项工作。这很难看,因为每个公共接口方法都有一个使用EntityManager执行事务的私有等价物。但是我也可以用一个静态em来解决这个问题! 然而,我想知道这是否是一个合适的设计,特别是因为这个类负责很多事情。 毫不奇怪,我在网上找到的真实项目的代码并不容易理解(那时我还不如用我的代码来记忆)。 代码很容易理解,尽管可能过于通用?无论如何,在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;
}
private static final Map ems=new HashMap();
私人最终实体经理em;
私人最终实体管理工厂emf;
公共无效开始生效(){
em.getTransaction().begin();
}
公共无效委托交易(){
em.getTransaction().commit();
}
公共数据库(最终字符串persistenceUnitName){
if(ems.containsKey(persistenceUnitName)){
em=ems.get(persistenceUnitName);
}否则{
put(persistenceUnitName,em=Persistence.createEntityManager工厂(persistenceUnitName.createEntityManager());
}
emf=em.getEntityManagerFactory();
this.persistenceUnitName=persistenceUnitName;
}
这种创建实例的方式是标准的,仍然保持单例连接/EntityManager。 另一方面,我想知道是否有必要在第一个单身ems? 优点是使用多个ems时,我会遇到锁定问题(不使用em.lock())


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

< P>可以考虑使用Spring 3。只需遵循干净的设计即可。

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

Adam说,他只遇到很少几个项目更换数据库供应商的情况,也没有任何情况下持久性会转移到RDBMs之外的其他东西。你为什么要为一件不太可能发生的事情付更多的钱?有时,当它发生时,一个更简单的解决方案可能会为自己买单,重写一个组件可能会变得更简单

我完全同意上述观点

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

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

如果你真的想走道,你可以:

  • 使用
  • 使用一些通用DAO库,如
  • 滚动你自己的通用刀