2012-07-18 3 views
0

Hibernate 3.1을 사용하고 M_devotee 및 M_member 클래스가있는 두 개의 매핑 파일 m_devotee 및 m_member가 있습니다. 나는 m_devotee 열에서 중복 항목을 피하기 위해 m_member 테이블의 devotee_id 외래 키로 참조되는 devotee_id 열을 피하고자합니다.외래 키 열의 중복 요소 방지

저는 Hibernate를 처음 접했고 매핑에 태그가 없는지 알고 싶습니다. 여기

내가 내 DAO 파일에 코드를 추가하여 중복을 방지하려고, 내 파일, 지금은 https://gist.github.com/2e2560e7a04a769848a4

있습니다. 그것은 나에게 ClassCastException을 준다. 또한 트랜잭션을 롤백하고 false를 서블릿에 반환하여 다른 JSP 파일로 전달하지 않아야합니다.

Query qr1=session.createQuery("select m.devotee_id from M_member m"); 
List<M_member> l1=qr1.list(); 
for(M_member mi:l1) 
{ 
if(!(l1.contains(member.getDevotee_id()))) 
{ 
    member.setDevotee_id(member.getDevotee_id()); 
//System.out.println("print devotee id"+member.getDevotee_id()); 
} 
} 

M_devotee 개체는 여기에 표시된대로 M_member에 캐스팅 할 수 없습니다.

나는 길을 잃었으며 모든 도움을 받았습니다.

+0

매핑에서 외래 키를 고유하게 표시하거나 필요하면 natural-id 또는 composite-id를 사용하십시오. – djmj

답변

2

매우 명확하지 않으며, 관련 매뉴얼 (그리고 자바 매뉴얼의 일부로 이름 지정 규칙에 대해서도 말하고있는 부분)에 관해 이야기하는 부분을 놓친 것 같습니다. 당신이 결과로 얻을 수있는 것들

select m.devotee_id from M_member m 

는 열애 ID의 목록이 될 것입니다 :

는하지만 확실 것은 당신이 필드 devotee_id를 조회하는 경우이다. M_ 회원 목록이 아닙니다. 따라서 devotee_id가 Long 유형의 필드라고 가정하면 List<Long>이됩니다. List<M_member>이 아닙니다.

1

M_member와 M_devotee 사이의 연결을 Java Set으로 매핑 된 양방향 다 대 일 관계로 설정하십시오. Set 인터페이스는 값이 컬렉션에 한 번만 추가되도록 보장하므로 중복 검사가 필요 없습니다.

<class name="Parent"> 
    <id name="id" column="parent_id"/> 
    .... 
    <set name="children" inverse="true"> 
     <key column="parent_id"/> 
     <one-to-many class="Child"/> 
    </set> 
</class> 

<class name="Child"> 
    <id name="id" column="child_id"/> 
    .... 
    <many-to-one name="parent" 
     class="Parent" 
     column="parent_id" 
     not-null="true"/> 
</class> 

하이버 네이트 문서 7.3.2를 참조하십시오. 양방향 연결 http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-bidirectional