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期间传播。
但是在我看来有点奇怪,您在与孩子一起工作时正在改变父母(偶然地……也许),并且不愿意存储这些改变。换句话说,也许解决方案是更改方法。
- 这个想法是不允许孩子允许更新父母。我希望孩子只有只读的父实体。我不想手动驱逐或分离它
-
就像我说的,在这种情况下,我们的问题是,我们在会话中加载了非只读实体(父)。每当调用session.flush()时,对它的任何更改都将导致SQL UPDATE语句。根据我的经验,我从未遇到过您描述的问题。我要么是要坚持父母及其子女(两个都改变了),要么是我正在与一个孩子一起工作,抚摸父母,但根本没有改变。因此,我建议您考虑整体设计...如果您知道我的意思。似乎不正确
-
我知道对象是共享的。只是我想仅在显式获取父对象时才更新父对象,而不是从子对象中获取父对象。
您可以在通过getter获得的父对象上调用EntityManager.detach()。对分离的实体所做的任何更改都不会同步到数据库。