嗨,大家好,我是Hibernate和JPA的新手
我写了一些函数,最初,我在实体类中设置了fetch = FetchType.LAZY.但它给了我错误:"org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话"
@OneToMany(cascade = CascadeType.ALL, mappedBy = "logins", fetch=FetchType.LAZY,targetEntity=Invoice.class)
public List<Invoice> getInvoiceList() {
return invoiceList;
}
public void setInvoiceList(List<Invoice> invoiceList) {
this.invoiceList = invoiceList;
}
Run Code Online (Sandbox Code Playgroud)
然后我把它改成了fetch = FetchType.EAGER,它工作得很好..... 我想知道如果我不声明FetchType会发生什么,Hibernate是否确定自己使用哪种方法?或者它是EAGER的默认值?
@OneToMany(cascade = CascadeType.ALL, mappedBy = "logins", fetch=FetchType.EAGER,targetEntity=Invoice.class)
public List<Invoice> getInvoiceList() {
return invoiceList;
}
public void setInvoiceList(List<Invoice> invoiceList) {
this.invoiceList = invoiceList;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!!!!!!!!!
jmo*_*ira 68
根据JPA 2.0规范,默认值如下:
我想知道如果我不声明会发生什么
FetchType,Hibernate是否确定自己使用哪种方法?或者它是EAGER的默认值?
实际上,这种行为不是Hibernate特有的,而是由JPA规范定义的,你可以在规范或者OneToMany注释或源代码的javadoc中找到答案.来自消息来源:
Run Code Online (Sandbox Code Playgroud)/** (Optional) Whether the association should be * lazily loaded or must be eagerly fetched. The * {@link FetchType#EAGER EAGER} strategy is a * requirement on the persistenceprovider runtime * that the associatedentities must be eagerly fetched. * The {@link FetchType#LAZY LAZY} strategy is a hint * to the persistence provider runtime. */ FetchType fetch() default LAZY;
话虽这么说,虽然有非常合理的用例FetchType.EAGER,EAGER只是为了避免LazyInitializationException(当你试图在分离的对象上加载延迟关联时发生)更多的是一个解决方案而不是一个真正的解决方案.