Hibernate OneToMany List或Iterator有什么不同?

时间:2017-06-22 04:31:13

标签: java hibernate hibernate-onetomany

@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列表中使用该怎么办?像上面的例子一样,性能方面有差异吗?存储器?

2 个答案:

答案 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,详细解释了代理性能。

默认情况下,实体的映射FetchTypelazy,hibernate会在属性周围创建代理。

在调用list.size()(等)后,hibernate将开始加载所有子对象。

如果我们不想加载所有内容,我们可以使用名为extra lazy的新功能。它仅针对特定记录发出select语句,例如,list.get(3)仅选择第四行。

如果我们用eager注释属性,那么hibernate将在加载父对象时加载所有子对象(使用外连接,这将有重复的问题)。在这种情况下,属性周围没有代理环绕。它不会产生性能差异,无论我们将其用作list还是iterator