Java Hibernate с постоянством Вопрос --- если метод FetchType не определен, какой метод используется по умолчанию? - PullRequest
10 голосов
/ 27 июня 2010

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

СПАСИБО !!!!!!!!!

Ответы [ 2 ]

68 голосов
/ 07 декабря 2012

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

  • OneToMany: LAZY
  • ManyToOne: EAGER
  • ManyToMany: LAZY
  • OneToOne: EAGER
  • Столбцы: EAGER
6 голосов
/ 27 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...