休眠:删除多对多关联 [英] Hibernate: delete many-to-many association

查看:124
本文介绍了休眠:删除多对多关联的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



- 数据库片段:



我有两张包含多对多关联的表格。 载入


ID

名称



会话

Id

日期



会话加载次数

LoadId

SessionId

- Hibernate映射片段:

  / * loads.hbm.xml * / 
< key column =LoadId/>
< / set>
...
/ * sessions.hbm.xml * /
< key column =SessionId/>
< / set>

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

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

load.getSessions()。remove(session);
loadDao.saveObject(load);

但是,启动后,此代码不会改变任何内容。

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

解决方案

您需要更新 Load Session

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

load.getSessions()。remove(session);
session.getLoads()。remove(load);
loadDao.saveObject(load);实际上,许多开发人员使用防御方法来管理双向关联。例如在 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);
}


I have two tables with the many-to-many association.

— DB fragment:

loads
Id
Name

sessions
Id
Date

sessionsloads
LoadId
SessionId

— Hibernate mapping fragments:

/* 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>

In order to remove one entry from the association table sessionsloads, I execute this code:

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

load.getSessions().remove(session);
loadDao.saveObject(load);

But, after launching, this code change nothing.

What's the right way to remove an association?

解决方案

You need to update both sides of the link between Load and Session:

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

load.getSessions().remove(session);
session.getLoads().remove(load);
loadDao.saveObject(load);

Actually, many developer use defensive methods to manage bi-directional associations. For example on Load, you could add the following methods:

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

这篇关于休眠:删除多对多关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆