【问题标题】:Hibernate many-to-many self-reference, how to delete without cascade?Hibernate多对多自引用,如何不级联删除?
【发布时间】:2011-10-17 15:17:17
【问题描述】:

我在单个对象上与其自身存在多对多关系:

    <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>

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

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

感谢所有帮助!!!

【问题讨论】:

    标签: java hibernate persistence cascade


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 2017-02-24
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      相关资源
      最近更新 更多