桌面应用程序中的JPA实体管理,其中对象用于保持修改状态

时间:2014-05-18 09:06:53

标签: java jpa desktop-application lifecycle

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

提取对象后,在UI端使用它来显示它并保持用户编辑。当用户按下"保存"按钮,调用持久层传递对象,然后将其存储回DB中。如果用户按下"取消"按钮修改被丢弃,持久层中没有任何反应。

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

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

我怎样才能获得它?

我想在从持久层返回对象之前分离对象。在这种情况下,在调用持久层之前,不会持久保存用户修改。

为了分离物体,我可以:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

如果你正在使用Hibernate作为你的实现(而且你并不太关心纯粹的JPA实现),那么在你分离之前确保所有关系都完全加载后,以下内容可能会有用: / p>

LazyinitialisationException

source