关于Java:在Hibernate中禁用对多个实体的更新

 2021-04-26 

Disable update to many to one entity in hibernate

我有一个父级和子级实体。子级具有Manytoone批注以引用父级。用例是当我通过findById加载子项并使用getter将父项移出时。然后,如果我更新父级,则可以保存父级。我不希望从孩子中拔出的父母是可更新的。

  • 我只想更新父项(如果我直接通过id找到它并更改属性并保存)。

  • 我知道当我从孩子那里获取getParent()时,它没有从孩子那里得到的Hibernate信息,而没有通过ID进行查找,而是对父对象进行了更新。

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

  • 有什么办法可以使父母从孩子那里拔出来,这是不可更新的?

    请随时提出任何澄清。


    您遇到的问题,实际上属于Hibernate Session。级联没有任何帮助。因为该会话被设计为我们的unit-of-work

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

    因此,一旦将Parent加载到会话中,就可以对其进行修改,随后刷新Session -对Parent的任何更改都将保留。

    您可以显式调用session.evict(parent),以避免更改在Flush期间传播。

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


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