Pertanyaan Java Hibernate with Persistence Question --- jika FetchType tidak didefinisikan, apa metode defaultnya?


Hai semuanya, saya baru di Hibernate dan JPA

Saya menulis beberapa fungsi, awalnya, saya set fetch = FetchType.LAZY di kelas entitas. Tapi itu memberi saya kesalahan: "org.hibernate.LazyInitializationException: tidak dapat menginisialisasi proxy - tanpa Sesi"

@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;
}

Lalu saya mengubahnya untuk menjemput = FetchType.EAGER, itu berfungsi dengan baik ..... Saya bertanya-tanya apa yang terjadi jika saya tidak menyatakan FetchType, apakah Hibernate menentukan sendiri metode mana yang digunakan? Atau apakah itu gagal oleh 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;
}

TERIMA KASIH!!!!!!!!!


10
2018-06-26 23:41


asal


Jawaban:


Saya bertanya-tanya apa yang terjadi jika saya tidak menyatakannya FetchType, apakah Hibernate menentukan sendiri metode mana yang digunakan? Atau apakah itu gagal oleh EAGER ??

Sebenarnya, perilaku ini tidak spesifik Hibernate tetapi didefinisikan oleh spesifikasi JPA dan Anda akan menemukan jawaban dalam spesifikasi atau di javadoc dari OneToMany anotasi atau sumber. Dari sumber:

/** (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;

Itu dikatakan, sementara ada kasus penggunaan yang sangat sah untuk FetchType.EAGER, menggunakan EAGER hanya untuk menghindari LazyInitializationException (yang terjadi ketika Anda mencoba untuk memuat asosiasi malas pada objek yang terpisah) lebih merupakan pekerjaan di sekitar daripada solusi nyata.


6
2018-06-27 00:00



Dari spesifikasi JPA 2.0, defaultnya seperti ini:

  • OneToMany: MALAS 
  • ManyToOne: EAGER 
  • Banyak ke banyak: MALAS 
  • OneToOne: EAGER
  • Kolom: EAGER

68
2017-12-07 14:47