Java 休眠:删除多对多关联

Java 休眠:删除多对多关联,java,hibernate,orm,many-to-many,Java,Hibernate,Orm,Many To Many,我有两个多对多关联的表 -数据库片段: 加载 Id 名字 会话 Id 日期 会话加载 LoadId 会话ID -休眠映射片段: /* loads.hbm.xml */ <set name="sessions" table="sessionsloads" inverse="true"> <key column="LoadId" /> <many-to-many column="SessionId" class="Session" /> </

我有两个多对多关联的表

-数据库片段:

加载
Id
名字

会话
Id
日期

会话加载
LoadId
会话ID

-休眠映射片段:

/* loads.hbm.xml */
<set name="sessions" table="sessionsloads" inverse="true">
    <key column="LoadId" />
    <many-to-many column="SessionId" class="Session" />
</set>
…
/* sessions.hbm.xml */
<set name="loads" table="sessionsloads">
    <key column="SessionId" />
    <many-to-many column="LoadId" class="Load" />
</set>
但是,在启动之后,该代码没有任何改变

删除关联的正确方法是什么?

看起来您只需要打开可传递持久性(例如,cascade=all delete orphan表示“full”可传递。)

-- 编辑 多亏了这次投票,阿尔休·帕斯卡(althugh Pascal)在这一点上说得很准确:单靠级联不足以解决最初的问题,但关系的双方都没有得到处理。教我赶快回答:)

--


另外,一个名为Session的实体打断了我的大脑:(

您需要更新
Load
Session
之间链接的两侧:

Session session = sessionDao.getObject(sessionId);
Load load = loadDao.getObject(loadId);

load.getSessions().remove(session);
session.getLoads().remove(load);
loadDao.saveObject(load);
实际上,许多开发人员使用防御方法来管理双向关联。例如,在加载时,您可以添加以下方法:

public void removeFromSessions(Session session) {
    this.getSessions().remove(session);
    session.getLoads().remove(this);
}
public void addToSessions(Session session) {
    this.getSessions().add(session);
    session.getLoads().add(this);
}

谢谢,尝试过了,但也不起作用。Hibernate甚至不向日志中写入任何
delete
查询。@Bar肯定还有其他问题,因为这肯定会起作用。稍后我将尝试使用您的映射进行复制,但我知道它起作用了。正如您提到的,
cascade
在这种情况下不起作用,对吗?还有,people say它可以与
会话.flush()
一起工作。但是如果我使用
getHibenateTemplate
该怎么办?你是对的,问题出在另一个地方-我对
compareTo()
函数的错误。谢谢!@Bar如果你省略了
inverse=“true”
,那么您将不会有一个双向关联,而是两个单向关联(这是非常不同的)。在这种情况下,是的,我相信您也必须保存
会话
实体。无论如何,谢谢您。实际上,您对
会话
投了赞成票。同意该名称完全不合适。但目前无法更改它。
public void removeFromSessions(Session session) {
    this.getSessions().remove(session);
    session.getLoads().remove(this);
}
public void addToSessions(Session session) {
    this.getSessions().add(session);
    session.getLoads().add(this);
}