Java Hibernate with Persistence问题---如果没有定义FetchType,默认方法是什么?

leo*_*eon 10 hibernate jpa

嗨,大家好,我是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规范,默认值如下:

  • OneToMany:懒惰
  • ManyToOne:EAGER
  • ManyToMany:LAZY
  • OneToOne:EAGER
  • 专栏:EAGER

  • 在JPA持久性文档中:https://docs.oracle.com/javaee/7/api/javax/persistence/package-summary.html这些注释中的每一个都指定了默认值.上表与文档中的内容相匹配. (5认同)

Pas*_*ent 6

我想知道如果我不声明会发生什么FetchType,Hibernate是否确定自己使用哪种方法?或者它是EAGER的默认值?

实际上,这种行为不是Hibernate特有的,而是由JPA规范定义的,你可以在规范或者OneToMany注释或源代码的javadoc中找到答案.来自消息来源:

/** (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;
Run Code Online (Sandbox Code Playgroud)

话虽这么说,虽然有非常合理的用例FetchType.EAGER,EAGER只是为了避免LazyInitializationException(当你试图在分离的对象上加载延迟关联时发生)更多的是一个解决方案而不是一个真正的解决方案.