2011-01-11 3 views
0

어노테이션을 사용하여 다 대다 관계를 설정하려고합니다. 여기 내 실체 내가 엔티티가 데이터의 샘플 세트는 여기 최대 절전 모드 매핑에 대한 질문

@Entity 
public class Publisher{ 
     @Id 
     public int id; 
    public String name; 
} 
@Entity 
public class PublisherBook{ 
     @Id 
     public int id; 
     @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="bookId",nullable=false) 
     public Book book; 
     @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="publisherId",nullable=false) 
     public Publisher Publisher; 
} 

@Entity 
public class Book{ 
     @Id 
     public int id; 
    public String name; 
     @OneToMany(fetch=FetchType.EAGER, mappedBy="book") 
    public Set<BookAuthor> authors; 
} 
@Entity 
public class BookAuthor{ 
     @Id 
     public int id; 
     @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="bookId",nullable=false) 
     public Book book; 
     @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="authorId",nullable=false) 
     public Author author; 
} 

@Entity 
public class Authors{ 
     @Id 
     public int id; 
    public String name; 
} 

가되어 있습니다

Author:(id,name) 
1, Author 1 
2, Author 2 
3, Author 3 

Book: (id, name) 
1, Book 1 
2, Book 2 
3, Book 3 

Publisher(id,name) 
1, Publisher 1 
2, Publisher 2 
3, Publisher 3 

BookAuthor (id, bookId, authorId) 
1, 1, 1 
2, 1, 2 
3, 1, 3 
4, 2, 1 
5, 3, 2 

PublisherBook(id, publisherId, bookId) 
1, 1, 1 
2, 1, 2 
3, 1, 3 
4, 2, 1 
5, 3, 2 

나는 제작사 1 (ID = 1)에 대한 모든 책의 목록을하려고하면에서 PublisherBook 표는 총 3 권을 반환합니다. 하지만 총 5 권의 책이 나옵니다. 1 권 (ID = 1) 다른 저자 값으로 3 번 반복되고있다 (1, 2, 3) 그래서 PublisherBook의 목록은 내가 책 엔티티로부터 PublisherBook의 목록을 설정을 제거하면

1, 1, 1 
1, 1, 1 
1, 1, 1 
2, 1, 2 
3, 1, 3 

을 반환 1 개 반환 올바른 값

게시자
1, 1, 1 
2, 1, 2 
3, 1, 3 

누군가가 내가 뭘 잘못 말해 줄래? 긴 게시물에 대한 사과.

답변

1

이것은 최대 절전 모드의 로딩 전략으로 인한 영향입니다. "authors"관계를 EAGER 페칭으로 정의 했으므로 AUTHOR 테이블의 JOIN이됩니다.

그래서 당신은 (응용 프로그램에 다른 긍정적 또는 부정적 영향을 미칠 수) LAZY로이 관계를 정의하거나 결과 변압기 사용할 수 있습니다이를 방지 :

criteria.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY를);