桌面SWING应用程序上的jpa

时间:2011-09-20 21:05:12

标签: java jpa desktop-application eclipselink

我正在使用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提供程序 感谢

4 个答案:

答案 0 :(得分:5)

据我所知,问题可归结为您是否应该打开EntityManager并全局存储其引用并在应用程序的任何位置访问同一个实例。

我认为如果您的应用程序是中小型应该没问题。请注意,由于各种因素,数据库连接(因此会话/实体管理器)可能会丢失。并且不要对事务执行此操作(即不要在开始时打开它们并在最后提交)。保持交易尽可能精细。

有很多有经验的人讨论过这方面的讨论,你可以在这里查看:forcounter关于这个问题的论证 - Session management using Hibernate in a Swing application

另请参阅同一主题的this

Here是由hibernate提交者创建的示例桌面应用程序。它有点旧,你可以得到这个想法。

最后this是了解桌面应用程序的一般JPA概念的好文章。

答案 1 :(得分:3)

在重新思考我的设计后,我决定改变它如下:

  • 在应用程序启动时创建一个“永久”EM,并在应用程序关闭之前保持打开状态。 permanentEM将用于在需要时查找/刷新实体(例如,用于获取延迟关系......) 为了确保通过WEAK参考模式有效管理内存,我将避免永久引用永久性管理实体的管理实体。
  • 创建一个'临时'EM来加载启动应用程序所必需的“永久”数据。加载数据后,关闭该临时EM,以分离所有已加载的内存数据。
  • 为每个持久化/合并/删除事务创建一个新的“临时”EM,并在事务提交后关闭它。

答案 2 :(得分:0)

由于它是SE应用程序,您可以使用嵌入式数据库。 我知道H2通常允许一个线程访问,所以如果你在同一个开发环境中并且想避免实体的头痛并发控制。

我的建议是将您的服务调用封装在一个线程中,并为该线程分配一个实体管理器。

不允许其他线程使用实体,然后定义数据访问接口,该接口可以将数据从实体传输到适当数据结构中的其他对象。

在一个世界中,我认为最好将所有实体放在一个实体管理器域中,并将它们与其他线程隔离开来。

答案 3 :(得分:0)

你看过http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/transactions.html#transactions-basics-issues了吗?我认为在继续使用会话对象太长时间之前阅读那里的文档是明智的。我想更好的方法是使用会话来完成一个简单的工作单元(例如:CRUD操作)。

希望它有所帮助!!

问候。