hibernate n+1问题

电脑小童 发布于 2014/06/25 13:06
阅读 326
收藏 1

我在查询所有班级中的所有学生的时候出现了Hibernate的n+1问题,其中已经配置了@Fetch(FetchMode.JOIN),但不知道为什么还是出现了n+1问题。

entity代码如下

Classes:

@Entity
@Table(name="classes")
public class Classes {
private int id;
private String name;
private Set<Person> persons = new HashSet<Person>(0);

@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(fetch=FetchType.LAZY,mappedBy="classes")
@Fetch(FetchMode.JOIN)
public Set<Person> getPersons() {
return persons;
}
public void setPersons(Set<Person> persons) {
this.persons = persons;
}


}

Person:

@Entity
@Table(name="person")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
public class Person {
private int id;
private String name;
private int age;
private int version;
private String path;
private Classes classes;

@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Version
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="classId")
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}





}

查询代码如下

List<Classes> clist = session.createQuery("from Classes c").list();
for(Classes c :clist){
for(Person person : c.getPersons()){
System.out.println(person.getName());
}
}

请大神帮忙解决下。

加载中
0
魔力猫
魔力猫

你定的是FetchType.LAZY,呀。延迟加载。

别把N+1这个问题看得太严重,特别是你还设定了缓存。只要命中率足够高这个影响其实并不大。你要真join取得不合适才容易出问题呢。

一切看性能测试说话。如果性能测试没问题,就别折腾。

返回顶部
顶部