【问题标题】:Hibernate: delete many-to-many associationHibernate:删除多对多关联
【发布时间】:2010-05-06 18:49:40
【问题描述】:

我有两个具有多对多关联的表。

——数据库片段:

加载
身份证
名称

会话
身份证
日期

sessionsloads
加载 ID
会话ID

——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>

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

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

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

但是,启动后,这段代码什么都没有改变。

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

【问题讨论】:

    标签: java hibernate orm many-to-many


    【解决方案1】:

    你需要更新LoadSession之间的链接两边:

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

    【讨论】:

    • 谢谢,试过了,还是不行。 Hibernate 甚至不会将任何delete 查询写入日志。
    • @Bar 一定有另一个问题,因为这肯定有效。稍后我会尝试使用您的映射重现,但我知道它正在工作。
    • 正如您所提到的,cascade 在这种情况下不起作用,对吧?此外,人们说它可以与session.flush() 一起使用。但是如果我使用getHibenateTemplate,我该怎么办?
    • 你说得对,问题出在另一个地方——compareTo() 函数是我的错。谢谢!
    • @Bar 如果您省略inverse="true",那么您将不会有一个双向关联,而是两个单向关联(这是非常不同的)。在这种情况下,是的,我相信您也必须保存 session 实体。
    【解决方案2】:

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

    -- 编辑 感谢您的支持,尽管 Pascal 是准确的,仅靠级联不足以解决最初的问题,但关系的双方都没有得到管理。教我赶紧回答:)

    --

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

    【讨论】:

    • 无论如何,谢谢。实际上,赞成Session。同意,因为它是完全不合适的名字。但目前无法更改。
    猜你喜欢
    • 2013-01-13
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2022-10-07
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多