2011-01-11 16 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冊の本を手に入れています。私はこの本のエンティティ、PublisherBookのリストから設定を削除する場合はブック1(ID = 1)異なる作者値で3回繰り返されている(1、2、3) だから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

これは、hibernateのローディング戦略による影響です。関係 "authors"をEAGERフェッチとして定義しました。これにより、AUTHORというテーブルのJOINが発生します。

ですから、(アプリケーション上の他の正または負の効果を有していてもよい)LAZYとしてこの関係を定義したり、結果のトランスを使用するか、これを避ける:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITYを)。