2011-11-10 4 views
1

남자, 다음 문제로 도와주세요.여러 가방을 가져올 수 없습니다 : 왜 @IndexColumn이 잘못된 결과를 반환합니까?

내 상위 항목에 두 개의 목록이 있으므로 유명한 "여러 봉지를 동시에 가져올 수 없습니다."오류가 발생했습니다. 다음은 코드 스크래치입니다.

class Manager{ 
    @OneToMany(cascade = CascadeType.ALL) 
    @Fetch(FetchMode.JOIN) 
    @IndexColumn(name = "id") 
    private List<Action> actions; 

    @OneToMany(cascade = CascadeType.ALL) 
    @Fetch(FetchMode.JOIN) 
    @IndexColumn(name = "id") 
    private List<Activity> activities; 
(...) 
} 

매핑이 단방향입니다.

좋아요, 나는 그것을 고치기 위해 IndexColumn 어노테이션을 사용할 수 있다고 봤습니다. 나는 그것을 구현했습니다, 여러분도 알다시피, 지금은 언급 된 예외를 얻지 못했습니다. 하지만 문제는 이제 db에서 모든 관리자를 얻으려는 경우 실제로 존재하는 관리자 인스턴스를 더 많이 받게된다는 것입니다.

예를 들어, 각 컬렉션에 1 개의 관리자 인스턴스와 3 개의 하위 인스턴스가있는 경우 9 개의 인스턴스가 있습니다. 이런 이유를 이해할 수있다 : Hibernate는

같은
select ... from Manager this_ 
left outer join manager_action actions3_ on this_.id=actions3_.Manager_id 
left outer join Action action4_ on actions3_.actions_id=action4_.id 
left outer join Manager_Activity activities5_ on this_.id=activities5_.Manager_id 
left outer join Activity activity6_ on activities5_.activities_id=activity6_.id 

을 보이는 선별 생산 ... 그리고 정말 하나보다 많은 행을 가져옵니다.

왜 이런 일이 발생합니까? 어떻게 해결할 수 있습니까?

답변

0

Hibernate는 카티 션 곱을 만들고이 경우에는 중복 제거를하지 않습니다. 이와 같은 데카르트 제품 (3 작업 * 3 작업 = 9 행)은 목록 대신 집합과 함께 사용할 수 있습니다.

두 세트가 있더라도 이러한 종류의 데카르트 제품은 피해야합니다. 100 액션과 100 액티비티로 관리자 한 명만 검색하면 데이터베이스에서 10,000 행을 검색합니다. 그 행동 (100 행) 활동과 같은 관리자를 가져

  • 하나 (100 행)
  • 만들 것와 관리자를 가져

    • 하나 : 당신은 아마도 두 개의 쿼리를해야한다 10,000 개 대신 200 개의 행만 있습니다. 활동은 세션의 동일한 Manager 인스턴스에 연결되므로 결과가 동일합니다. 또한 중복 문제를 피할 수 있습니다.

    +0

    감사합니다. JB Nizet! (1) 그러나 Hibernate가 여러 행을 올바른 방법으로 처리 할 수있는 경우를 설명 할 수 있습니까? (2) 두 번째 질문은 추가 행이 추가 쿼리보다 왜 나빠 졌다고 생각합니까? – KutaBeach

    관련 문제