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

PublisherBook テーブルから Publisher 1 (id=1) のすべての書籍のリストを取得しようとすると、合計 3 冊の書籍が返されます。しかし、私は合計5冊の本を手に入れています。Book 1(id​​ = 1) は異なる author 値 (1, 2, 3) で 3 回繰り返されているため、PublisherBook のリストが返されます。

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

Set を Book エンティティから削除すると、出版社 1 の PublisherBook のリストは正しい値を返します

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

誰かが私が間違っていることを教えてもらえますか? 長文失礼いたしました。

4

1 に答える 1

1

これは、休止状態の読み込み戦略による影響です。リレーション「authors」を EAGER フェッチとして定義したため、テーブル AUTHOR の JOIN が発生します。

したがって、これを回避するには、この関係を LAZY として定義するか (アプリケーションに他のプラスまたはマイナスの影響を与える可能性があります)、結果トランスフォーマーを使用します。

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

于 2011-01-11T07:22:00.203 に答える