Hibernate不删除子表中的记录

时间:2016-08-10 01:40:21

标签: hibernate

members.hbm.xml的映射如下:

<set  name="licenses">
    <key column="member_id"/>
    <one-to-many class="com.model.License"/>
</set>
<set  name="sessions">
    <key column="member_id"/>
    <one-to-many class="com.model.Session"/>
</set>

session.hbm.xml有:

<many-to-one class="com.model.Member" name="member">
  <column name="member_id" not-null="true"/>
</many-to-one>

license.hbm.xml具有:

<many-to-one name="member" column="member_id" 
                 class="com.model.Member"/>

尝试在成员表中执行删除:

session.delete(member);

它会引发异常。

  

Hibernate:更新许可证设置member_id = null其中member_id =?   org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions列   &#39; member_id&#39;不能为空

我也尝试使用cascade="delete-orphan"。但它没有用。

理想情况下,当删除成员表中的特定记录时,我希望删除许可证和会话表中的记录。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

抱歉,我不熟悉hbm.xml。我将尝试用基于注释的映射术语来解释这个问题,并希望能够构成一些xml示例。

为了简化您的问题,您要做的是双向一对多关系(在您的情况下,如果您想要级联删除,它实际上是父子关系):

        1    *
Member  <----> License

在Hibernate中,你需要决定谁拥有这种关系。如果你有父方(Member)拥有这种关系,你会发现Member + License的插入/删除将涉及member_idlicense的更新(这就是我从你的例外中观察到)。在大多数情况下,它不是优选的。我们通常让孩子们拥有这种关系。这是通过使用mappedBy

完成的

(伪代码)

class Member {
  //...

  @OneToMany(mappedBy = "member", cascade=ALL, orphanRemoval=true)
  List<License> licenses;
}

class License {
  //...

  @ManyToOne
  Member member;
}

这里的诀窍是mappedBy

hbm.xml中的等效性为inverse

// member.hbm.xml
<set  name="licenses" inverse="true" />
// of course you need to set cascade delete and delete-orphan

// license.hbm.xml
<many-to-one name="member" column="member_id" 
                 class="com.model.Member"/>