我正在使用 SWING 开发单用户桌面应用程序。我对这种使用 java.sql api 的应用程序有一点经验,并发现它根本不舒服......
在我的新应用程序中,我第一次尝试使用 JPA,我阅读了很多教程,这些教程使我了解了几乎所有我需要的东西,但没有找到真正的 Java 桌面应用程序的好例子.
我正在考虑使用以下架构,但不知道我是否正确...
我想创建一个 MyPersistenceUnit 类:
public class MyPersistenceUnit {
private static EntityManagerFactory factory;
private static EntityManager entityManager;
public static void initiate(){
factory=Persistence.createEntityManagerFactory("PU_Name");
entityManager=factory.createEntityManager();
}
public static EntityManager getEntityManager() {
return entityManager;
}
public static void close(){
entityManager.close();
factory.close();
}
}
initiate() 方法将首先被调用,close() 方法将在应用程序关闭时调用。
当应用程序运行时,所有事务都将通过 getEntityManager() 实例完成,该实例可在应用程序的任何位置访问。如果我对 JSE 应用程序的理解是正确的,那么获得的实体管理器具有扩展的持久性上下文,它将在实体管理器不关闭的同时将所有实体保持在托管状态,这就是让我这样想的原因......
我不知道我是否遗漏了什么,所以任何提示将不胜感激
请注意,我正在将 eclipselink 提供程序与 derby 嵌入式数据库一起使用。
谢谢
最佳答案
据我了解,问题归结为您是否应该打开 EntityManager 并在全局范围内存储其引用并在应用程序的任何位置访问相同的实例。
如果您的应用程序是中小型,我认为应该没问题。请注意数据库连接(因此 session/entityManager)可能会由于各种因素而断开。并且不要对事务执行此操作(即不要在开始时打开它们并在结束时提交)。尽可能细化事务。
有更多有经验的人对此进行了各种讨论,您可以在此处关注:for和 counter关于这个 SO 问题的争论 - Session management using Hibernate in a Swing application
另见 this关于同一主题。
Here是由 hibernate 的提交者创建的示例桌面应用程序。它有点旧,你可以理解。
最后 this是了解桌面应用程序的一般 JPA 概念的好文章。
关于java - 桌面 SWING 应用程序上的 jpa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7491761/