2011-02-01 2 views
1

Hibernate는 many to many entries를 재 작성한다.

annotion을 통해 다른 객체의 콜렉션을 보유하는 도메인 객체가 있습니다.

@ManyToMany(fetch=FetchType.LAZY,cascade = { CascadeType.MERGE, CascadeType.PERSIST}) 
    @JoinTable(name = "join_table", [email protected](name="a_id", referencedColumnName = "a_id"), [email protected](name = "b_id", referencedColumnName = "b_id")) 
    private List<B> BsList; 

조인 테이블에서 추가 데이터 열을 보유합니다.

목록을 보유하고 setBsList()를 호출하는 객체를 사용하여 작업 할 때 추가 열에있는 데이터가 삭제된다는 사실을 발견했습니다. Hibernate는 매번 join 테이블의 행을 다시 쓰게됩니까?

답변

1

가입 테이블에서 추가 데이터 열을 보유합니다.

추가 데이터 열이있는 경우 이 아니며 조인 테이블입니다. PK가 될 수있는 두 개의 FK가있는 테이블입니다. 그리고 Hibernate는 올바른 일을합니다. 따라서이 "가짜 조인 테이블"을 나타내는 또 다른 엔티티를 생성하고 이에 따라 매핑해야합니다.

+0

예 "법적"조인 테이블이 아니라는 것을 알고 있지만 위의 경우를 제외하고는 조인 테이블에 매핑이 없습니다. 최대 절전 모드는 이러한 추가 필드를 식별하여 동작을 유지합니까? 아니면 최대 절전 모드가 항상 이러한 다시 쓰기를 수행합니까? –

+0

아니요, 올바르게 기억한다면 Hibernate는 기존 링크를 식별하고 변경 사항을 업데이트/생성/삭제하는 대신 모든 "링크"를 삭제하고 다시 만듭니다. 따라서, 그들은 같은 기록으로 보일지도 모르지만 실제로는 새로운 기록입니다. – jpkrohling

1

setBsList()을 호출하면 안되며, 그렇지 않으면 getBsList()을 직접 수정해야한다. 그렇지 않으면, Hibernate는 변경된 것을 추적 할 수있는 방법이 없다.

로드 할 때 실제 List은 지연로드를 처리하고 추가 및 제거 된 내용을 추적하여 올바르게 업데이트 할 수있는 최대 절전 모드 구현입니다. 이것을 다른 목록 구현으로 바꾸면 이전 목록을 삭제하고 새 항목 만 추가하십시오. 콜렉션과 함께 Hibernate를 사용하는 경우, 실수로 이것을 할 수 없도록 setter를 보호하는 것이 좋습니다.