我有以下hibernate映射和java类结构:
<class name="A" abstract="true" table="tableA" lazy="false">
<id name="id" type="long">
<generator class="native" />
</id>
<discriminator column="type" type="string" />
<!--common properties-->
<subclass name="B" abstract="true" >
<join table="tableB">
<key column="aId"/>
<!--subclass common properties-->
</join>
<subclass name="B1" discriminator-value="B1TYPE" >
<!--subclass properties-->
</subclass>
<subclass name="B2" discriminator-value="B2TYPE" >
<!--subclass properties-->
</subclass>
</subclass>
</class>
<class name="C" table="tableC">
<id name="id" type="long">
<generator class="native" />
</id>
<set name="items" cascade="all,delete-orphan">
<key column="id" not-null="true" />
<one-to-many class="A" />
</set>
</class>
和java部分:
abstract class A
{
}
abstract class B extends A
{
}
class B1 extends B
{
}
class B2 extends B
{
}
class C
{
Set<A> items;
}
问题在于,有些行已从tableB
删除,但未从tableA
删除。可能的原因是什么?
编辑:
从class C
删除项目时,C
从其存储库类中存储:
C.items.remove(B1);
CRepository.store(C);
答案 0 :(得分:2)
原因是您必须明确定义指向on-delete
的{{1}}外键声明的操作tableB
。
默认情况下,这是aId
:这意味着当您删除任何B实体时,不会删除相应的A相关实体。
查找有关Hibernate文档的更多信息,5.1.11.3. Key
试试这个映射:
noaction