Java Hibernate с вопросом о сохранении --- если FetchType не определен, каков метод по умолчанию?

Привет, ребята, я новичок в 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;
}

Затем я изменил его на 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;
}

БЛАГОДАРЯ!!!!!!!!!

Ответ 1

Мне интересно, что произойдет, если я не объявлю FetchType, Hibernate сам определяет, какой метод использовать? Или это по умолчанию EAGER??

Собственно, это поведение не относится к Hibernate, но определено спецификацией JPA, и вы найдете ответ в спецификации или в javadoc OneToMany или источники. Из источников:

/** (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 (который возникает, когда вы пытаетесь загрузить ленивую ассоциацию на отдельный объект) - это больше работа вокруг реального решения.

Ответ 2

Из спецификации JPA 2.0 значения по умолчанию имеют следующий вид:

  • OneToMany: LAZY
  • ManyToOne: EAGER
  • ManyToMany: LAZY
  • OneToOne: EAGER
  • Столбцы: EAGER