2

我有一个父子实体。Child 有一个 Manytoone 注释来引用 Parent。用例是当我加载一个孩子findById并使用getter. 那么如果我更新父级,我就可以保存父级。我不希望从孩子身上提取出来的父母是可更新的。

  1. 如果我直接通过 id 找到它并更改属性并保存,我只想更新父级。

  2. 我知道当我从 child 执行getParent()时,hibernate 没有任何信息,它从 child 获取它并且没有通过 id 找到并更新到 parent。

  3. 我在 Parent 上的 ManytoOne 上尝试了 Immutable 注释,但它不会阻止触发更新。

有什么办法可以让父母从孩子身上拉出来不可更新?

随时询问任何澄清。

4

2 回答 2

3

您遇到的问题,实际上属于 Hibernate Session它与Cascading无关。因为会议是unit-of-work为我们设计的。

每当您通过 ID 或 2) 通过引用访问对象 1) 时,该对象(从那一刻起) “缓存”在Session. Session它是生命周期内所有处理过程中共享的一个实例。

因此,一旦将Parent加载到会话中,无论如何您都在对其进行修改,然后Session将其刷新- 任何更改Parent都将保留。

您可以显式调用session.evict(parent),以避免在Flush.

但在我看来有点奇怪,你在和孩子一起工作时改变了父母(不小心......也许)并且不愿意存储这些变化。换句话说,也许解决方案是改变方法。

于 2013-09-04T03:33:55.193 回答
1

您可以调用EntityManager.detach()通过 getter 获得的父级。对分离实体所做的任何更改都不会同步到数据库。

于 2013-09-04T03:35:13.587 回答