hibernateTemplate.delete()删除关系表中的正确实体和FK

时间:2015-01-25 16:55:27

标签: hibernate-mapping

我有两张桌子:“Libros”和“Autores”。这种关系是多对多的。

当我从Libros中删除一个条目(HibernateTemplate.delete(libro))时,此操作删除中间表“Libros_autores”(右侧)上的记录。但它在Autores表上删除了一条不适合我的记录。

在映射文件中将级联从“all”更改为“save-update”但是它失败了,因为表libros_autores上有一个来自Libros的FK的id。因此,如果删除了Libros记录,则必须删除libros_autores中的行以避免约束问题(这对我来说绝对是逻辑)。

然后我的问题是:如果我删除表Libros上的记录,它也会删除表autores上的记录,我只想删除表:Libros和libros_autores。

映射文件是:

Libro.hbm.xml

<class name="app.modelo.Libro" table="libros">

        <id name="isbn" column="ISBN" type="string" length="20">
                 <generator class="assigned" />
        </id>
     <set name="autores" table="autores_libros" inverse="true" cascade="all,delete-orphan">
                <key column="ISBN"/>
                <many-to-many column="ID_AUTOR" class="app.modelo.Autor"/>
            </set>
</class>

Autor.hbm.xml

  <class name="app.modelo.Autor" table="autores">

        <id name="id" column="ID_AUTOR" type="integer" length="20">
            <generator class="native" />
        </id>
    <set name="libros" table="autores_libros" cascade="all">
        <key column="ID_AUTOR"/>
        <many-to-many column="ISBN" class="app.modelo.Libro"/>
    </set>
  </class>

1 个答案:

答案 0 :(得分:0)

我知道你不应该使用cascade =&#34; all&#34;。我认为这意味着当你排除libro时它会真正排除autor。我理解这种关系无论如何都会被删除。

请参阅书中的#34; Hibernate in Action&#34;:

  

我们选择了cascade =&#34; save-update&#34;对于集合的两端;这不是不合理的。另一方面,cascade =&#34; all&#34;,cascade =&#34; delete&#34;和cas-cade =&#34; all-delete-orphans&#34;对于多对多关联没有意义,因为当只删除一个父对象时,不应删除具有可能多个父对象的实例。