Hibernate4多对多查询出重复的记录
很简单很常见的关联关系, 我却遇到问题,有工会会员Member和工会俱乐部Club,是多对多关系,如下代码:
Dao和service都是非常普通的写法。
然后我就写了个简单的测试程序。
这个程序应该出现的结果是 一个Member,它关联了3个Club;但是出来的结果吓了我一跳,居然在页面上显示了3条一样的Member。但是数据库只有一条。
我知道出3条的原因是采用左连接造成的:
请问我错在哪里? 该怎么配置才能只出现一条?
@Entity
@Table(name = "tu_member")
public class Member extends BaseEntity<Member>{
private static final long serialVersionUID = 5939777389315777218L;
private String name;
private String gender;
private Date birthday;
private String company;
private String department;
@ManyToMany(targetEntity = Club.class, cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
@JoinTable(name = "tu_club_member", joinColumns = { @JoinColumn(name = "member_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "club_id", nullable = false) })
@ForeignKey(name = "none", inverseName = "none")
private List<Club> clubs;
public List<Club> getClubs() {
return clubs;
}
public void setClubs(List<Club> clubs) {
this.clubs = clubs;
}
public String getName() {
return name;
}
。。。。。。
@Entity
@Table(name = "tu_club")
public class Club extends BaseEntity<Club>{
private static final long serialVersionUID = 1058338119416690351L;
private String name;
private String company;
private String description;
private String coordinator;
@ManyToMany(targetEntity = Member.class)
@JoinTable(name = "tu_club_member", joinColumns = { @JoinColumn(name = "club_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "member_id", nullable = false) })
@ForeignKey(name = "none", inverseName = "none")
private List<Member> members;
public List<Member> getMembers() {
return members;
}
public void setMembers(List<Member> members) {
this.members = members;
}
public String getName() {
return name;
}
。。。。。。
Dao和service都是非常普通的写法。
然后我就写了个简单的测试程序。
Member member = new Member();
member.setName("Member1");
member.setBirthday(new Date());
member.setGender("Male");
member.setCompany("CSTS");
member.setDepartment("ICG V");
Club club = new Club();
club.setCompany("CSTS");
club.setName("Swimming");
Club club1 = new Club();
club1.setCompany("CSTS");
club1.setName("Table Tennies");
List<Club> list = new ArrayList<Club>();
list.add(club);
list.add(club1);
member.setClubs(list);
memberService.save(member);
Club club2 = new Club();
club2.setName("Drink");
club2.setCompany("CSTS");
member.getClubs().add(club2);
memberService.save(member);
List<Member> members = memberService.findAll();
这个程序应该出现的结果是 一个Member,它关联了3个Club;但是出来的结果吓了我一跳,居然在页面上显示了3条一样的Member。但是数据库只有一条。
我知道出3条的原因是采用左连接造成的:
select
this_.id as id11_1_,
this_.birthday as birthday11_1_,
this_.company as company11_1_,
this_.department as department11_1_,
this_.gender as gender11_1_,
this_.name as name11_1_,
clubs2_.member_id as member1_11_3_,
club3_.id as club2_13_3_,
club3_.id as id10_0_,
club3_.company as company10_0_,
club3_.coordinator as coordina3_10_0_,
club3_.description as descript4_10_0_,
club3_.name as name10_0_
from
tu_member this_
left outer join
tu_club_member clubs2_
on this_.id=clubs2_.member_id
left outer join
tu_club club3_
on clubs2_.club_id=club3_.id
请问我错在哪里? 该怎么配置才能只出现一条?
...全文
相关推荐
Hibernate、Spring和Struts工作原理及使用理由
4. 提供丰富的映射关系,支持一对一、一对多、多对多等多种关系。关于Hibernate的延迟加载,它允许对象在实际需要时才加载,降低内存消耗。
spring struts hibernate 自己整理的 很不错 收集了许多题型
**增强的性能**:Hibernate能够缓存查询结果,减少数据库访问次数,提高应用性能。4. **广泛的数据库支持**:Hibernate支持多种数据库,提供了高度的可移植性。
hibernate开发包
通过深入学习和理解Hibernate,开发者可以更好地驾驭Java Web应用的持久层,创建出高效、稳定的数据库解决方案。
HIbernate 3.2.5GA
**查询缓存(Query Cache)**:缓存查询结果,避免重复计算。3. **延迟加载(Lazy Loading)**:按需加载关联对象,减少内存消耗。4.
Struts、Hibernate、Spring经典面试题收藏
- **多对多关系**:通常需要一个中间表来关联双方,中间表至少包含两个外键字段。#### Hibernate 查询方式1. **SQL查询**:可以直接编写SQL语句执行查询操作。2.


