在hibernate中禁用多个到一个实体的更新

时间:2013-09-04 00:46:31

标签: java hibernate jpa

我有一个父子实体。 Child有一个Manytoone注释来引用Parent。用例是当我按findById加载孩子并使用getter获取父项时。那么如果我更新父母,我可以保存父母。我不希望父母是可以更新的,这是从孩子那里撤出的。

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

  2. 我知道当我从孩子那里得到 getParent()时,hibernate没有任何信息它是从孩子那里得到的,而不是通过id找到并对父母进行更新。

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

  4. 有什么方法可以让父母从不可更新的孩子中退出来?

    随时提出任何澄清。

2 个答案:

答案 0 :(得分:3)

您遇到的问题实际上属于Hibernate Session。它与 Cascading 没有任何关系。因为会话被设计为我们的unit-of-work

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

因此,一旦Parent加载到会话中,您无论如何都要修改它,之后Session 已刷新 - 对Parent的任何更改坚持不懈。

您可以明确地致电session.evict(parent),以避免Flush期间的变更传播。

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

答案 1 :(得分:1)

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