代码之家  ›  专栏  ›  技术社区  ›  simpatico

JPA2/EclipseLink的DAO结构是什么?

  •  4
  • simpatico  · 技术社区  · 16 年前

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

    这种创建实例的方式是标准的,仍然保持一个singleton连接/entitymanager。 另一方面,我想知道是否有必要在一开始就单一的ems? 优点是我遇到多个ems锁定问题(不使用em.lock())。

    有什么反馈吗?有没有真实的或教程代码来演示使用JPA2和EclipseLink的DAO?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Pascal Thivent    16 年前

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

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

    我完全同意上述观点。

    无论如何,问题仍然是 实体管理器 答案在很大程度上取决于应用程序(web应用程序、桌面应用程序)的性质。

    下面是一些链接,可以帮助您决定哪些内容适合您的情况:

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

        2
  •  1
  •   Damien    16 年前

    你可以考虑使用Spring3。跟着我走 their documentation 为了一个干净的设计。