2.1 opsi pengambilan

Pengembang Hibernate telah mengetahui masalah memuat entitas anak sejak lama. Jadi hal pertama yang mereka lakukan adalah menambahkan parameter pengambilan khusus ke anotasi @OneToMany, @ManyToMany.

Parameter ini dapat mengambil dua nilai:

  • INGIN SEKALI
  • MALAS

Contoh:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")

Jika parameter pengambilan sama dengan EAGER , maka saat entitas induk dimuat, semua entitas anaknya juga akan dimuat. Selain itu, Hibernate akan mencoba melakukannya dalam satu kueri SQL, menghasilkan kueri yang lumayan dan mendapatkan semua data sekaligus.

Jika parameter pengambilan mengambil nilai LAZY , maka saat entitas induk dimuat, entitas anak tidak akan dimuat. Sebagai gantinya, objek proxy akan dibuat.

Dengan bantuan objek proxy ini, Hibernate akan melacak akses ke entitas anak ini dan memuatnya ke dalam memori saat pertama kali diakses.

Jika kami mengingat situasi kami dengan komentar:


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

Maka Anda memiliki "pilihan keren":

Jika fetch = FetchType.EAGER, maka Hibernasi akan memuat semua komentar pada baris pertama kode:

User user = session.get(User.class, 1);		//load all comments here
List<Comment> comments = user.getComments();

Jika fetch = FetchType.LAZY, maka Hibernasi akan memuat semua komentar pada baris kode ke-2:

User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here

Seperti yang sudah bisa Anda tebak, Anda tidak punya pilihan jika tidak memuat semua komentar :)

2.2 Nilai default

Jika Anda tidak menentukan opsi pengambilan untuk @ManyTo... anotasi, maka Hibernasi akan menggunakan nilai default.

Mereka sedikit berbeda untuk jenis anotasi yang berbeda. Untuk anotasi @OneToOnedan @ManyToOneBERSEMANGAT, untuk anotasi @OneToManydan @ManyToManyMALAS. Mudah diingat - jika kita merujuk ke satu objek, maka itu akan dimuat sepenuhnya. Jika kita mengacu pada sebuah koleksi, maka koleksi tersebut akan dimuat saat pertama kali diakses.

2.3 anotasi @LazyCollection

Seperti yang telah Anda lihat, parameter pengambilan tidak banyak membantu saat bekerja dengan koleksi. Pembuat Hibernate mencoba memperbaikinya dengan menambahkan anotasi khusus @LazyCollection. Biasanya ditulis seperti ini:

@LazyCollection(LazyCollectionOption.TRUE)

Anda perlu menentukannya saat memetakan kolom 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 memiliki parameter nilai yang dapat mengambil salah satu dari tiga nilai:

  • LazyCollectionOption. BENAR
  • LazyCollectionOption. PALSU
  • LazyCollectionOption. TAMBAHAN

Dua opsi pertama sangat mirip dengan opsi pengambilan.

Jika parameter disetel ke LazyCollectionOption.TRUE, artinya nilai kolom komentar tidak akan dimuat dari database saat objek induk Pengguna dimuat. Objek bertipe Comment akan dimuat saat pertama kali kolom komentar diakses. Sebenarnya, ini setara dengan parameternyaFetchType.LAZY

Jika parameter disetel ke LazyCollectionOption.FALSE, artinya nilai kolom komentar akan dimuat dari database pada saat objek induk Pengguna dimuat. Objek bertipe Comment akan dimuat saat pertama kali kolom komentar diakses. Sebenarnya, ini setara dengan FetchType.EAGER.