桌面SWING应用程序上的jpa

Geo*_*rey 5 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();
        }

    }
Run Code Online (Sandbox Code Playgroud)

activate()方法将是第一个被调用的方法,并且当应用程序关闭时将调用close()方法.

在应用程序运行时,所有事务都将通过getEntityManager()实例完成,该实例可在应用程序的每个位置访问.如果我对JSE应用程序的理解是正确的,那么获得的实体管理器有一个扩展的持久化上下文,它将使所有实体保持在托管状态,而实体管理器不会被关闭,这就是让我这样思考的原因......

我不知道我是否遗漏了什么,所以任何小费都会受到赞赏

请注意,我正在使用eclipselink提供程序和derby嵌入式数据库.
谢谢

kda*_*bir 5

据我了解,问题归结为您是否应该打开EntityManager并全局存储其引用并在应用程序中的任何位置访问相同的实例.

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

已经有各种讨论,其中比较有经验的人了解它的讨论,你可以按照在这里:对于计数器在这太问题的说法- 在Swing应用程序使用Hibernate的Session管理

也可以在同一主题上看到这一点.

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

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


Geo*_*rey 3

经过重新思考我的设计,我决定更改如下:

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

  • 请注意:我已经在使用非常相似设计的生产系统上大量使用 Eclipselink 一年了。虽然该应用程序实际上是一个 EE 框架,但我必须跳过各种应用程序服务器并自行管理事务。Eclipselink 在不超时、缓存和“正常工作”方面做得非常好。如果您与数据存在客户端-服务器关系,那么您所建议的方法将会很好地工作(缓存可能不会反映数据库的状态)。如果您不使用它,您可能会发现缓存带来了较小的性能提升。祝你好运。 (2认同)