Java Hibernate与持久性问题——如果未定义FetchType,默认方法是什么?

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

我不熟悉Hibernate和JPA

我编写了一些函数,最初,我在entity类中设置了fetch=FetchType.LAZY。但它给了我一个错误:

“org.hibernate.LazyInitializationException:无法初始化代理-无会话”

@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规范,默认设置如下:

  • 一个女人:懒惰
  • 曼尼通:渴望
  • 很多人:懒惰
  • 渴望
  • 专栏:渴望

你确定吗?在JPA持久性文档中:每个注释都指定默认值。上表与文档中的内容相匹配。您今天帮我省去了一件头疼的事^!!
@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;