@Entity
@Table(name = "STUDENT")
public class Student {
private long studentId;
private String studentName;
private List<Phone> studentPhoneNumbers;
....
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_PHONE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "PHONE_ID") })
public List<Phone> getStudentPhoneNumbers() {
return this.studentPhoneNumbers;
}
public void setStudentPhoneNumbers(List<Phone> studentPhoneNumbers) {
this.studentPhoneNumbers = studentPhoneNumbers;
}
}
1)
Student student = session.loadStudent(123); // pseudocode
List phoneList = student.getStudentPhoneNumbers();
for (Phone p : phoneList) {
...
}
2)
Student student = session.loadStudent(123); // pseudocode
List phoneList = student.getStudentPhoneNumbers();
Iterator itr = phoneList.iterator();
while(itr.hasNext()) {
...
}
我从这里读到答案:difference between query.list and query.iterate
显然,list()
和iterator()
(Query
)之间存在差异。如果我在OneToMany
列表中使用该怎么办?像上面的例子一样,性能方面有差异吗?存储器?
答案 0 :(得分:1)
它与Hibernate无关。
当Java Compiler遇到
时for (Phone p : phoneList) {
....
}
它会自动生成相当于
的代码for (Iterator<Phone> itr = phoneList.iterator(); itr.hasNext();) {
Phone p = itr.next();
....
}
因此,您所展示的两个示例基本相同。
答案 1 :(得分:-1)
我读了这篇Hibernate chapter,详细解释了代理性能。
默认情况下,实体的映射FetchType
为lazy
,hibernate会在属性周围创建代理。
在调用list.size()
(等)后,hibernate将开始加载所有子对象。
如果我们不想加载所有内容,我们可以使用名为extra lazy
的新功能。它仅针对特定记录发出select
语句,例如,list.get(3)
仅选择第四行。
如果我们用eager
注释属性,那么hibernate将在加载父对象时加载所有子对象(使用外连接,这将有重复的问题)。在这种情况下,属性周围没有代理环绕。它不会产生性能差异,无论我们将其用作list
还是iterator
。