hibernate中的多对多关系删除连接表数据?
我在休眠中有多对多的关系。 数据库表是:
events(event_id,name)
speaker(speaker_id,name)
event_speaker(event_id,speaker_id)
event.hbm.xml
<set name="speakers" table="event_speakers" cascade="save-update">
<key column="event_id"/>
<many-to-many class="com.manytomany.model.Speaker"/>
</set>
seller.hbm.xml
<set name="events" table="event_speakers" cascade="save-update">
<key column="speaker_id"/>
<many-to-many class="com.manytomany.model.Event"/>
</set>
中实现了.equals和hashcode方法,
,我已经在Event.java和Speaker.java Event.javaSpeaker.java
@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;
}
这
@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;
}
逻辑
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正在执行像这
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 (?, ?)
就是为什么它从连接表中删除,我想插入新行而不是在连接表中删除。
i have many to many relationship in hibernate.
DB tables are:
events(event_id,name)
speaker(speaker_id,name)
event_speaker(event_id,speaker_id)
event.hbm.xml
<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
<set name="events" table="event_speakers" cascade="save-update">
<key column="speaker_id"/>
<many-to-many class="com.manytomany.model.Event"/>
</set>
and i have implemented .equals and hashcode methods in Event.java and Speaker.java
Event.java
@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
@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;
}
here is my logic
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();
when i run above code hibernate is executing like this
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 (?, ?)
why it is deleting from the join table, i want to insert new row instead of deleting in join table.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在我看来,你们的扬声器是平等的。我会调查布尔返回值,
我的猜测是,在检查添加到集合中的相等性时,扬声器的 id 为空(对象仍然是瞬态的)。因此,使用生成的 id 来实现相等是危险的。
解决办法之一:去掉 Event 和 Speaker 上的 equals() 和 hashcode() 方法。
关注点:对于多对多集合,您在加载单个实体时面临加载整个数据库的风险。如果您加载一个演讲者,它将获取所有该演讲者的事件,这反过来又会获取所有这些事件的演讲者......哎呀。即使您将集合标记为延迟加载,也会为使用它们的人制造一个雷区。
另一种方法:您可以使用组合并围绕 event_speaker 表创建一个 EventSpeaker 实体。然后,您将创建 DAO 和服务层,为您提供所需的方法,例如获取演讲者的所有事件的能力,反之亦然。如果有必要的话,它还允许您添加扬声器事件组合特有的属性。
It looks to me like your speakers are equal. I would investigate the boolean return value for
My guess would be that the id of your speakers are null (the objects are still transient) when being checked for equality on addition to the set. Using the generated id for equality is dangerous for this reason.
One fix: get rid of the equals() and hashcode() methods on Event and Speaker.
Concern: With many to many sets, you run the risk of loading the entire database when loading a single entity. If you load a Speaker, it will fetch all that Speaker's Events, which in turn will fetch all those Event's Speakers...yikes. Even if you mark the collections for lazy loading, you make a minefield for people using them.
Another way: You could use composition and create an EventSpeaker entity around the event_speaker table. You would then create DAO and Service layers that provide you with the methods you need, like the ability to get all the Events for a Speaker and vice versa. It would also allow you to add properties unique to a SpeakerEvent combination, should that prove necessary.