Hibernate多对多自引用,如何删除没有级联?

时间:2011-10-17 06:28:40

标签: java hibernate persistence cascade

我对单个对象有多对多的关系:

    <set name="relatedPersons" lazy="false"  table="PersonRelatedPerson" 
           cascade="none" >
    <key column="personId" foreign-key="fk_related_person" not-
        null="false"/>
       <many-to-many column="relatedPersonId" class="Person" not-found="ignore"/>
    </set>

你可以看到我已经将cascade设置为“none”,因为当我删除一个人时,当然我只想删除PersonRelatedPerson表中的关系,而不是相关人员他们自己。当我尝试使用此映射进行删除时,我得到了 ConstraintViolationException:无法执行JDBC批量更新....

我猜测通过正确设置一些映射标志可以通过hibernate删除它(或者我必须做一些奇怪的解决方法,例如。首先从第一人称集删除第二人,从第一人删除第一人)第二,然后先删除....我真的不想这样做:D)

感谢所有帮助!!!

1 个答案:

答案 0 :(得分:4)

您只需要自己删除这些关系。要做到这一点,在移除A人之前,您必须找到所有在相关人员组中拥有A的人,并从这些集中删除A.如果你不这样做,那么你当然不能删除A,因为其他人仍然引用A.

使用HQL查询执行此操作并从Java中找到的人员集中删除A,或使用专用SQL删除查询从联接表中删除所有行。但请注意,此SQL查询将绕过缓存(第一级和第二级,如果有的话),因此您的会话可能会保留不正确的数据库视图。