Отношение многие ко многим в спящем режиме при удалении данных таблицы соединений? - PullRequest
3 голосов
/ 23 января 2012

У меня есть много ко многим отношениям в спящем состоянии.Таблицы БД:

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>

, и я реализовал методы .equals и hashcodeв Event.java и 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;
    }

вот моя логика

        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 (?, ?)

почему он удаляется из таблицы соединений, я хочу вставить новую строку вместо удаления в таблице соединений.

1 Ответ

0 голосов
/ 24 января 2012

Мне кажется, что ваши ораторы равны.Я бы исследовал логическое возвращаемое значение для

event.getSpeakers().add(speaker2);

Я полагаю, что идентификатор ваших динамиков равен нулю (объекты все еще переходные) при проверке на равенство при добавлении в набор.Использование сгенерированного идентификатора для равенства опасно по этой причине.

Одно исправление: избавьтесь от методов equals () и hashcode () в Event и Speaker.

Беспокойство: от многих ко многимустанавливает, вы рискуете загрузить всю базу данных при загрузке одного объекта.Если вы загрузите Speaker, он будет извлекать все события Speaker, которые, в свою очередь, будут извлекать все эти Speaker ... yikes.Даже если вы пометите коллекции для отложенной загрузки, вы создадите минное поле для людей, использующих их.

Другой способ: вы можете использовать композицию и создать объект EventSpeaker вокруг таблицы event_speaker.Затем вы создадите уровни DAO и Service, которые предоставят вам необходимые методы, например, возможность получить все события для докладчика и наоборот.Это также позволит вам добавить свойства, уникальные для комбинации SpeakerEvent, если это окажется необходимым.

...