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"
。但它没有用。
理想情况下,当删除成员表中的特定记录时,我希望删除许可证和会话表中的记录。我怎样才能做到这一点?
答案 0 :(得分:0)
抱歉,我不熟悉hbm.xml。我将尝试用基于注释的映射术语来解释这个问题,并希望能够构成一些xml示例。
为了简化您的问题,您要做的是双向一对多关系(在您的情况下,如果您想要级联删除,它实际上是父子关系):
1 *
Member <----> License
在Hibernate中,你需要决定谁拥有这种关系。如果你有父方(Member
)拥有这种关系,你会发现Member + License
的插入/删除将涉及member_id
表license
的更新(这就是我从你的例外中观察到)。在大多数情况下,它不是优选的。我们通常让孩子们拥有这种关系。这是通过使用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"/>