Hibernate不支持“删除 - 孤立”级联一对一或多对一关系。我最近发现了这一点,它给了我一个严重的头痛。我的模型中有几个类被设计成使得孩子在父母之外没有真正的世界意义。我父母只有一个DAO,而子类没有单独的DAO。
这有效:
parent.getChild().setProperty("something");
parentDao.save(parent);
这没有做任何事情:
parent.setChild(null);
parentDao.save(parent);
这非常不幸,因为现在我必须重新考虑我的DAO层和服务层的一些操作。
有没有人以优雅的方式解决这个限制?我真的只想关注持久的父对象。在这种特殊情况下,没有理由处理子持久性,除非让Hibernate满意,只有在删除子节点的情况下。
答案 0 :(得分:4)
它似乎是他们可以解决的框架中的退缩,希望很快就会
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2608
这张票是在2007年开张的,最近的帖子抱怨这个问题是最近一个月前。
我正在做的是在我的对象上放置一个名为isMarkedForDeletion的属性。如果返回true,我的dao或我的服务会显式删除。它肯定不如delete-orphan那么好,但它在spring + hibernate框架中运行良好。
我会密切关注这篇文章,因为这是一个非常重要的问题。
答案 1 :(得分:3)
此处描述的解决方法https://forum.hibernate.org/viewtopic.php?p=2379216对我有用。它使用@OneToMany与“many”侧的单个元素关联来实现@OneToOne关联并解决remove-orphans问题。
答案 2 :(得分:2)
Heureka,已在Hibernate 4.27中修复 https://hibernate.atlassian.net/browse/HHH-6484 (未经测试)
答案 3 :(得分:-1)
在子表上的update触发器上写入数据库。如果父键为空,则从子项中删除记录