我正在使用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提供程序 感谢
答案 0 :(得分:5)
据我所知,问题可归结为您是否应该打开EntityManager并全局存储其引用并在应用程序的任何位置访问同一个实例。
我认为如果您的应用程序是中小型应该没问题。请注意,由于各种因素,数据库连接(因此会话/实体管理器)可能会丢失。并且不要对事务执行此操作(即不要在开始时打开它们并在最后提交)。保持交易尽可能精细。
有很多有经验的人讨论过这方面的讨论,你可以在这里查看:for和counter关于这个问题的论证 - Session management using Hibernate in a Swing application
另请参阅同一主题的this。
Here是由hibernate提交者创建的示例桌面应用程序。它有点旧,你可以得到这个想法。
最后this是了解桌面应用程序的一般JPA概念的好文章。
答案 1 :(得分:3)
在重新思考我的设计后,我决定改变它如下:
答案 2 :(得分:0)
由于它是SE应用程序,您可以使用嵌入式数据库。 我知道H2通常允许一个线程访问,所以如果你在同一个开发环境中并且想避免实体的头痛并发控制。
我的建议是将您的服务调用封装在一个线程中,并为该线程分配一个实体管理器。
不允许其他线程使用实体,然后定义数据访问接口,该接口可以将数据从实体传输到适当数据结构中的其他对象。
在一个世界中,我认为最好将所有实体放在一个实体管理器域中,并将它们与其他线程隔离开来。
答案 3 :(得分:0)
希望它有所帮助!!
问候。