首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在hibernate中删除连接表数据中的多对多关系?

在hibernate中删除连接表数据中的多对多关系?
EN

Stack Overflow用户
提问于 2012-01-24 03:53:50
回答 1查看 3K关注 0票数 3

我在hibernate中有多对多的关系。DB表包括:

代码语言:javascript
复制
events(event_id,name)
speaker(speaker_id,name)
event_speaker(event_id,speaker_id)

event.hbm.xml

代码语言:javascript
复制
<set name="speakers" table="event_speakers" cascade="save-update">
<key column="event_id"/>
<many-to-many class="com.manytomany.model.Speaker"/>
</set>

speaker.hbm.xml

代码语言:javascript
复制
<set name="events" table="event_speakers" cascade="save-update">
<key column="speaker_id"/>
<many-to-many class="com.manytomany.model.Event"/>
</set>

我已经在Event.java和Speaker.java中实现了.equals和哈希码方法

Event.java

代码语言:javascript
复制
@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    Event event = (Event)obj;
    return this.id == event.id;
}
@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return (int)id;
}

Speaker.java

代码语言:javascript
复制
@Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        Speaker speaker = (Speaker)obj;
        return this.id == speaker.id;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return (int)id;
    }

这是我的逻辑

代码语言:javascript
复制
        session.beginTransaction();
        Event event = (Event) session.createCriteria(Event.class).add(Restrictions.eq("id", 1L)).uniqueResult();
        event.setSpeakers(new HashSet());
        Speaker speaker = new Speaker();
        speaker.setName("11");
        Speaker speaker2 = new Speaker();
        speaker2.setName("12");

        event.getSpeakers().add(speaker);
        event.getSpeakers().add(speaker2);
        session.save(event);
        session.getTransaction().commit();

当我运行上面的代码时,hibernate是这样执行的

代码语言:javascript
复制
Hibernate: select this_.event_id as event1_0_0_, this_.event_name as event2_0_0_ from events this_ where this_.event_id=?
Hibernate: select max(speaker_id) from speakers
Hibernate: insert into speakers (speaker_name, speaker_id) values (?, ?)
Hibernate: delete from event_speakers where event_id=?
Hibernate: insert into event_speakers (event_id, elt) values (?, ?)

为什么要从连接表中删除,我想在连接表中插入新行而不是删除。

EN

回答 1

Stack Overflow用户

发布于 2012-01-25 00:53:23

在我看来你们的演讲者是一样的。我将研究布尔型返回值

代码语言:javascript
复制
event.getSpeakers().add(speaker2);

我的猜测是,在检查除集合之外的相等性时,扬声器的id是空的(对象仍然是瞬态的)。由于这个原因,使用生成的id进行相等是危险的。

一个修复方法:去掉Event和Speaker上的equals()和hashcode()方法。

关注点:对于多对多的集合,当加载单个实体时,您将面临加载整个数据库的风险。如果您加载一个Speaker,它将获取该Speaker的所有事件,而这些事件又将获取所有这些事件的Speakers...yikes。即使您将集合标记为延迟加载,您也会为使用它们的人制造一个雷区。

另一种方法:您可以使用组合,并围绕event_speaker表创建一个EventSpeaker实体。然后,您将创建DAO和服务层,它们为您提供所需的方法,例如,能够获取Speaker的所有事件,反之亦然。如果有必要,它还允许您添加SpeakerEvent组合所特有的属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8977745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档