【问题标题】:JPA entities management in a desktop application where object are used to keep modification state桌面应用程序中的 JPA 实体管理,其中对象用于保持修改状态
【发布时间】:2014-05-18 09:06:53
【问题描述】:

我在现有桌面应用程序中引入 JPA,该应用程序具有持久层,其中对象从数据库中提取并使用普通查询存储回来。

提取对象后,在 UI 端使用它来显示它并保持用户编辑。当用户按下“保存”按钮时,将调用持久层并传递对象并将其存储回数据库中。如果用户按下“取消”按钮,修改将被丢弃,并且持久层不会发生任何事情。

我正在用 JPA 替换普通查询机制。现在的问题是,当使用 JPA 检索对象时,它是被管理的。当用户对其进行修改时,更改将直接存储在数据库中。

我无法修改 UI 代码,因此新的持久层(基于 JPA)应该模拟旧的持久层(基于普通查询)的行为。

我怎样才能获得它?

我正在考虑在将对象从持久层返回之前分离它们。在这种情况下,直到调用持久层,用户修改才会持久化。

为了分离对象我可以:

  • 调用EntityManager 中的分离方法。此解决方案需要对关系进行注释以分离相关对象。
  • 在每次持久层操作后清除 EntityManager。

分离解决方案正确吗? 哪种分离方法更好?

【问题讨论】:

    标签: java jpa desktop-application lifecycle


    【解决方案1】:

    是的,这正是 detach 方法解决的用例,我肯定会采用您的两种方法中的第一种,后者似乎有点极端,可能会影响性能。

    您显然应该警惕延迟加载的关系,并确保在分离对象并将其公开给表示层之前已完全初始化所有必需的对象,否则您将遇到可怕的LazyinitialisationException

    如果您使用 Hibernate 作为您的实现(并且您不太关心是否拥有纯 JPA 实现),那么以下内容可能有助于确保在您分离之前完全加载所有关系:

    public static <T> T initializeAndUnproxy(T entity) {
        if (entity == null) {
            return null;
        }
        if (entity instanceof HibernateProxy) {
            Hibernate.initialize(entity);
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation();
        }
        return entity;
    }
    

    source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多