【问题标题】:Hibernate not deleting records in child tableHibernate不删除子表中的记录
【发布时间】:2016-08-10 10:23:54
【问题描述】:

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

它抛出一个异常。

休眠:更新许可证集 member_id=null where member_id=? org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions 列 'member_id' 不能为空

我也尝试使用cascade="delete-orphan"。但它不起作用。

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

【问题讨论】:

  • 尝试级联删除? (不是删除孤儿)
  • 刚刚试过。同样的例外。
  • 我对您的实体的外观有点困惑(抱歉,我更习惯于基于注释的映射)。你有Member 1&lt;--&gt;* License 对吗?当我们有双向关系时,我们通常使用“mappedBy”(类似于inverse=true for hbm.xml)的“one”端,并在one 端设置级联。这是我从您的代码中看不到的东西,您的异常向我表明级联不适用于您的情况。
  • 如果我们有一个双向的一对多关系并且“一”方拥有该关系(这似乎是在你的情况下)。在大多数情况下,这不是可取的映射。

标签: hibernate


【解决方案1】:

对不起,我对 hbm.xml 不熟悉。我将尝试用基于注解的映射术语来解释问题,并希望能编出一些 xml 示例。

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

        1    *
Member  <----> License

在 Hibernate 中,您需要决定谁拥有关系。如果您的父方 (Member) 拥有该关系,您会发现插入/删除 Member + License 将涉及更新 license 表中的 member_id(这是我从您的异常中观察到的)。在大多数情况下,这不是优选的。我们通常让孩子拥有这段关系。这是通过使用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"/>

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 2018-10-30
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多