2012-01-23 4 views
3

나는 최대 절전 모드에서 많은 관계를 유지하고있다. DB 테이블은 다음과 같습니다최대 절전 모드에서 많은 수의 관계가 조인 테이블 데이터를 삭제합니까?

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> 

내가 Event.java에 .equals 및 해시 방법을 구현하고 Speaker.java

Event.java

내가 그것을 조인에서 삭제되는 이유

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

처럼 실행되는 코드가 최대 절전 위에 실행할 때

@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(); 

입니다 테이블, 내가 조인 테이블에서 삭제하는 대신 새 행을 삽입하고 싶습니다.

+2

무엇이 문제입니까? – Pace

+0

하나의 이벤트는 많은 스피커를 가질 수 있고 하나의 스피커는 많은 이벤트를 가질 수 있습니다. 그래서 나는 새로운 이벤트를 추가 할 때마다 새로운 행을 조인 테이블에 삽입해야합니다. 그러나 기존 이벤트에 새 스피커를 추가하려는 경우 행이 조인 테이블에서 삭제되고 새 스피커로 삽입됩니다. 나는이 테이블을 얻으려면 어떻게하면 되겠습니까? –

답변

0

당신의 스피커가 평범한 것 같이 보입니다. 나는 세트에 추가에 대한 평등에 대한 확인 될 때 ​​(개체가 여전히 과도하다) 스피커의 id가 null 있다는 것

event.getSpeakers().add(speaker2); 

내 생각에 대한 부울 반환 값을 조사 할 것입니다. 생성 된 id를 평등하게 사용하는 것은 위험합니다.

이벤트 및 스피커에서 equals() 및 hashcode() 메소드를 제거하십시오.

문제점 : 여러 세트를 사용하면 단일 엔티티를로드 할 때 전체 데이터베이스를로드 할 위험이 있습니다. 발표자를로드하면 해당 발표자의 모든 이벤트를 가져오고 모든 이벤트의 발표자를 가져옵니다. 게으른 로딩을위한 콜렉션을 표시하더라도, 당신은 그들을 사용하는 사람들을 위해 지뢰밭을 만듭니다.

다른 방법 : composition을 사용하고 event_speaker 테이블 주위에 EventSpeaker 엔티티를 만들 수 있습니다. 그런 다음 DAO 및 서비스 레이어를 만들어 스피커에 대한 모든 이벤트를 가져 오는 기능과 같이 필요한 방식을 제공합니다. 또한 필요한 경우 SpeakerEvent 조합에 고유 한 속성을 추가 할 수 있습니다.

+0

테이블에있는 기존 테이블을 삭제하면서 새로운 행을 삽입하려고합니다 ... –

관련 문제