2.1 pilihan ambil
Pembangun Hibernate telah mengetahui masalah memuatkan entiti anak untuk masa yang lama. Jadi perkara pertama yang mereka lakukan ialah menambah parameter pengambilan khas pada anotasi @OneToMany
, @ManyToMany
.
Parameter ini boleh mengambil dua nilai:
- BERSEMANGAT
- MALAS
Contoh:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
Jika parameter ambil adalah sama dengan EAGER , maka apabila entiti induk dimuatkan, semua entiti anaknya juga akan dimuatkan. Selain itu, Hibernate akan cuba melakukannya dalam satu pertanyaan SQL, menghasilkan pertanyaan yang besar dan mengambil semua data sekaligus.
Jika parameter ambil mengambil nilai LAZY , maka apabila entiti induk dimuatkan, entiti anak tidak akan dimuatkan. Sebaliknya, objek proksi akan dibuat.
Dengan bantuan objek proksi ini, Hibernate akan menjejaki akses kepada entiti anak ini dan memuatkannya ke dalam memori pada kali pertama ia diakses.
Jika kita mengimbas kembali keadaan kita dengan ulasan:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
Kemudian anda mempunyai "pilihan bergaya":
Jika fetch = FetchType.EAGER
, maka Hibernate akan memuatkan semua komen pada baris pertama kod:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
Jika fetch = FetchType.LAZY
, maka Hibernate akan memuatkan semua komen pada baris ke-2 kod:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
Seperti yang anda sudah boleh meneka, anda tidak mempunyai pilihan apabila ia tidak memuatkan semua komen :)
2.2 Nilai lalai
Jika anda tidak menentukan pilihan ambil untuk @ManyTo
... anotasi, maka Hibernate akan menggunakan nilai lalai.
Ia sedikit berbeza untuk jenis anotasi yang berbeza. Untuk anotasi @OneToOne
dan @ManyToOne
EAGER, untuk anotasi @OneToMany
dan @ManyToMany
MALAS. Ia mudah diingat - jika kita merujuk kepada satu objek, maka ia akan dimuatkan sepenuhnya. Jika kita merujuk kepada koleksi, maka ia akan dimuatkan pada kali pertama ia diakses.
2.3 @LazyCollection anotasi
Seperti yang telah anda lihat, parameter pengambilan tidak banyak membantu apabila bekerja dengan koleksi. Pencipta Hibernate cuba membetulkannya dengan menambahkan anotasi khas @LazyCollection
. Ia biasanya ditulis seperti ini:
@LazyCollection(LazyCollectionOption.TRUE)
Anda perlu menentukannya apabila memetakan medan koleksi:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
Anotasi ini mempunyai parameter nilai yang boleh mengambil salah satu daripada tiga nilai:
- LazyCollectionOption. BENAR
- LazyCollectionOption. SALAH
- LazyCollectionOption. TAMBAHAN
Dua pilihan pertama sangat serupa dengan pilihan ambil.
Jika parameter ditetapkan kepada LazyCollectionOption.TRUE
, ini bermakna bahawa nilai medan ulasan tidak akan dimuatkan daripada pangkalan data apabila objek Pengguna induk dimuatkan. Objek jenis Komen akan dimuatkan pada kali pertama medan ulasan diakses. Malah, ini adalah setara dengan parameterFetchType.LAZY
Jika parameter ditetapkan kepada LazyCollectionOption.FALSE
, ini bermakna bahawa nilai medan ulasan akan dimuatkan daripada pangkalan data pada masa memuatkan objek Pengguna induk. Objek jenis Komen akan dimuatkan pada kali pertama medan ulasan diakses. Malah, ini adalah setara dengan FetchType.EAGER
.