我有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的真实世界或教程代码?
答案 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进行简洁设计即可。