【发布时间】: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