问题描述
- 数据库片段:
我有两张包含多对多关联的表格。 载入
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);
}
这篇关于休眠:删除多对多关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!