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