我正在尝试使用注释设置多对多关系。 这是我的实体
@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本书。第1册(id = 1)被重复3次,不同的作者值(1,2,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
有人能告诉我我做错了什么吗?为长篇大论道歉。
答案 0 :(得分:1)
由于hibernate的加载策略,这是一种效果。您将关键字“authors”定义为EAGER提取,这将导致表AUTHOR的JOIN。
因此,请避免这种情况,您可以将此关系定义为LAZY(可能对您的应用程序产生其他正面或负面影响)或使用结果转换器:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);