Hibernate:删除多对多关联

0x2*_*9A3 9 java orm many-to-many hibernate

我有两个表与多对多关联.

- 数据库片段:

加载
Id
名称

会议
ID
日期

sessionsloads
LoadId
SessionId

- Hibernate映射片段:

/* 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>
Run Code Online (Sandbox Code Playgroud)

为了从关联表sessionsloads中删除一个条目,我执行以下代码:

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

load.getSessions().remove(session);
loadDao.saveObject(load);
Run Code Online (Sandbox Code Playgroud)

但是,启动后,此代码没有任何改变.

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

Pas*_*ent 15

您需要更新之间的链路的两侧LoadSession:

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

load.getSessions().remove(session);
session.getLoads().remove(load);
loadDao.saveObject(load);
Run Code Online (Sandbox Code Playgroud)

实际上,许多开发人员使用防御方法来管理双向关联.例如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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Bar某处肯定会有另一个问题因为这肯定有效.我将尝试稍后使用您的映射重现,但我知道它正在工作. (2认同)

Aff*_*ffe 5

看起来你只需要打开Transitive持久性(例如,cascade = all-delete-orphan for"full"transitive.)

- 编辑感谢你的upvote,虽然帕斯卡尔准确认为单独的级联不足以解决原来的问题,但关系的双方都没有得到管理.教我匆匆回答:)

-

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