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) 以不同的作者值(1、2、3)重复 3 次,因此 PublisherBook 列表返回

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

如果我从 Book 实体中删除 Set,则发布者 1 的 PublisherBook 列表将返回正确的值

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

有人可以告诉我我做错了什么吗?为长篇道歉。

4

1 回答 1

1

这是由于hibernate的加载策略造成的。您将关系“authors”定义为 EAGER fetching,这将导致表 AUTHOR 的 JOIN。

因此,避免这种情况,您可以将此关系定义为 LAZY(这可能对您的应用程序有其他积极或消极影响)或使用结果转换器:

标准.setResultTransformer(标准.DISTINCT_ROOT_ENTITY);

于 2011-01-11T07:22:00.203 回答