2011-01-11 96 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列表返回

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

如果我从Book实体删除设置,PublisherBook名单为发布商1返回正确的值

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

有人可以告诉我我做错了什么吗?对长期职位道歉。

回答

1

这是由于hibernate的加载策略而产生的效果。您将关系“作者”定义为EAGER抓取,这将导致表AUTHOR的JOIN。

所以避免这种情况,你可以定义这种关系为LAZY(这可能对您的应用程序的其他正面或负面的影响),或使用结果变压器:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);