我有一个父子实体。 Child有一个Manytoone注释来引用Parent。用例是当我按findById
加载孩子并使用getter
获取父项时。那么如果我更新父母,我可以保存父母。我不希望父母是可以更新的,这是从孩子那里撤出的。
如果我直接通过ID找到并更改属性并保存,我只想更新父级。
我知道当我从孩子那里得到 getParent()时,hibernate没有任何信息它是从孩子那里得到的,而不是通过id找到并对父母进行更新。
< / LI>我在Parent上尝试了ManytoOne上的Immutable注释,但它不会阻止更新被触发。
有什么方法可以让父母从不可更新的孩子中退出来?
随时提出任何澄清。
答案 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()
。对分离实体所做的任何更改都不会同步到数据库。