Hibernate4多对多查询出重复的记录

sunxing007 sunxing007 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
很简单很常见的关联关系, 我却遇到问题,有工会会员Member和工会俱乐部Club,是多对多关系,如下代码:

@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


请问我错在哪里? 该怎么配置才能只出现一条?
...全文

相关推荐

评论 12
收藏 已收藏
分享
返回顶部
sunxing007
Java EE 67,535 成员 225,843 内容