Java Hibernate与持久性问题——如果未定义FetchType,默认方法是什么?
我不熟悉Hibernate和JPA 我编写了一些函数,最初,我在entity类中设置了fetch=FetchType.LAZY。但它给了我一个错误: “org.hibernate.LazyInitializationException:无法初始化代理-无会话”Java Hibernate与持久性问题——如果未定义FetchType,默认方法是什么?,hibernate,jpa,Hibernate,Jpa,我不熟悉Hibernate和JPA 我编写了一些函数,最初,我在entity类中设置了fetch=FetchType.LAZY。但它给了我一个错误: “org.hibernate.LazyInitializationException:无法初始化代理-无会话” @OneToMany(cascade=CascadeType.ALL,mappedBy=“logins”,fetch=FetchType.LAZY,targetEntity=Invoice.class) 公共列表getInvoiceLis
@OneToMany(cascade=CascadeType.ALL,mappedBy=“logins”,fetch=FetchType.LAZY,targetEntity=Invoice.class)
公共列表getInvoiceList(){
返回发票清单;
}
公共作废setInvoiceList(列表invoiceList){
this.invoiceList=invoiceList;
}
然后我把它改为fetch=FetchType.EAGER,它工作得很好
我想知道 如果我不声明FetchType,Hibernate会决定使用哪个方法吗?还是由“渴望”默认
@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;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy=“logins”,fetch=FetchType.EAGER,targetEntity=Invoice.class)
公共列表getInvoiceList(){
返回发票清单;
}
公共作废setInvoiceList(列表invoiceList){
this.invoiceList=invoiceList;
}
我想知道如果我不声明FetchType
,会发生什么,Hibernate是否自行决定使用哪种方法?或者它是由EAGER默认的
实际上,这种行为不是特定于Hibernate的,而是由JPA规范定义的,您可以在规范或注释或源代码的javadoc中找到答案。来源:
也就是说,虽然有非常合理的
FetchType.EAGER
用例,但使用EAGER
只是为了避免lazyiinitializationexception
(当您尝试在分离的对象上加载惰性关联时发生)更像是一种变通方法,而不是真正的解决方案 根据JPA 2.0规范,默认设置如下:
- 一个女人:懒惰
- 曼尼通:渴望
- 很多人:懒惰
- 渴望
- 专栏:渴望
@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;
}
/** (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;