Hibernate 映射 - 如何连接三个表
Hibernate Mapping - How to Join Three Tables
我有 3 个实体:人、车和专业。
@Entity
@Table(name = "PERSON")
public class Person implements Serializable {
@Id
private Long id;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Car> cars;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Profession> professions;
}
@Entity
@Table(name = "PROFESSION")
public class Profession implements Serializable {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
}
@Entity
@Table(name = "CAR")
public class Car implements Serializable {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
}
当我试图检索与两个职业和一辆汽车有联系的人时,结果是两个职业和两辆重复的汽车。
或者他连接了五辆车和一个职业,结果是五辆车和五个重复的职业。
我应该如何更正映射才能收到正确的结果?
使用 Set
映射 oneToMany 如果您不想重复。它与映射 table 中的 <set>
元素映射。所以首先你对这些部分进行更改:
private Set<Car> car = new HashSet<Car>(0);
@OneToMany(fetch=FetchType.LAZY, mappedBy="persons")
public Set<Car> getCar() {
return this.car;
}
public void setCar(Set<Car> car) {
this.car = car;
}
对 profession 和另一个 oneToMany 做同样的事情,你不想重复。您可以根据加载首选项设置 fetchType。 Eager
一次加载,Lazy
按需加载,这通常是最好的。
我有 3 个实体:人、车和专业。
@Entity
@Table(name = "PERSON")
public class Person implements Serializable {
@Id
private Long id;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Car> cars;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Profession> professions;
}
@Entity
@Table(name = "PROFESSION")
public class Profession implements Serializable {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
}
@Entity
@Table(name = "CAR")
public class Car implements Serializable {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
}
当我试图检索与两个职业和一辆汽车有联系的人时,结果是两个职业和两辆重复的汽车。
或者他连接了五辆车和一个职业,结果是五辆车和五个重复的职业。
我应该如何更正映射才能收到正确的结果?
使用 Set
映射 oneToMany 如果您不想重复。它与映射 table 中的 <set>
元素映射。所以首先你对这些部分进行更改:
private Set<Car> car = new HashSet<Car>(0);
@OneToMany(fetch=FetchType.LAZY, mappedBy="persons")
public Set<Car> getCar() {
return this.car;
}
public void setCar(Set<Car> car) {
this.car = car;
}
对 profession 和另一个 oneToMany 做同样的事情,你不想重复。您可以根据加载首选项设置 fetchType。 Eager
一次加载,Lazy
按需加载,这通常是最好的。