【发布时间】:2018-01-25 19:57:10
【问题描述】:
我有一个简单的编辑器 UI,用于在数据库表上执行 CRUD。 在 Hibernate 5.1 下,该过程是:
- 创建一个会话。读入数据对象。关闭会话,分离对象。
- 使用分离的对象填充 UI 小部件。
- 允许用户在 UI 中添加/编辑/删除条目,修改分离的对象。
- 在用户“保存”操作时:创建一个新会话。使用 saveOrUpdate() 保存新的/更新的对象。关闭会话。
- 根据需要重复。
Hibernate 5.2 强烈建议从 Hibernate-native API 迁移到 JPA API。 JPA 不允许您重新附加分离的对象。
有几种解决方法:
- 使用 unwrap 从 JPA EntityManager 获取 Hibernate 会话,并使用它来调用 saveOrUpdate。我不喜欢这个选项,因为它依赖于不属于 JPA 的功能。
- 使用 JPA 合并,这将更新持久对象,但我必须确保不会破坏任何关联。这给了我同一个对象的 2 个副本,一个是持久的,一个是分离的……这很混乱。
- 执行手动合并操作,将已修改的字段从分离对象复制到持久对象。这是额外的工作。
- 在整个过程中保持单个 EntityManager 实例处于活动状态。不幸的是,其他线程可以在此会话仍处于打开状态时执行 CRUD 操作,从而使持久化上下文与数据库表不同步。所以我也不喜欢这种方法。
有什么好的方法可以做到这一点,或者这些是唯一可用的选项吗?
【问题讨论】: