2.1 getirme seçeneği

Hibernate'in geliştiricileri, alt varlıkları yükleme sorununu uzun süredir biliyorlar. Böylece yaptıkları ilk şey, ek açıklamalara özel bir getirme parametresi eklemek@OneToMany oldu .@ManyToMany

Bu parametre iki değer alabilir:

  • İSTEKLİ
  • TEMBEL

Örnek:

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

fetch parametresi EAGER'a eşitse , üst varlık yüklendiğinde, onun tüm alt varlıkları da yüklenir. Ayrıca, Hibernate bunu tek bir SQL sorgusunda yapmaya çalışacak, ağır bir sorgu oluşturacak ve tüm verileri bir kerede getirecektir.

fetch parametresi LAZY değerini alırsa , üst varlık yüklendiğinde alt varlık yüklenmez. Bunun yerine, bir proxy nesnesi oluşturulacaktır.

Bu proxy nesnesinin yardımıyla Hibernate, bu alt varlığa erişimi izleyecek ve ilk erişildiğinde onu belleğe yükleyecektir.

Durumumuzu yorumlarla hatırlayacak olursak:


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

O zaman "şık bir seçiminiz" var:

, ise fetch = FetchType.EAGERHazırda Beklet, tüm yorumları 1. kod satırına yükleyecektir:

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

, ise fetch = FetchType.LAZYHazırda Beklet, 2. kod satırındaki tüm yorumları yükleyecektir:

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

Zaten tahmin edebileceğiniz gibi, tüm yorumları yüklemediğinde başka seçeneğiniz yok :)

2.2 Varsayılan değer

... ek açıklaması için bir getirme seçeneği belirtmezseniz @ManyTo, Hazırda Bekletme varsayılan değerleri kullanır.

Farklı ek açıklama türleri için biraz farklıdırlar. Ek açıklamalar için @OneToOneve @ManyToOneEAGER, ek açıklamalar için @OneToManyve @ManyToManyLAZY. Hatırlaması kolay - bir nesneye atıfta bulunursak, o zaman tamamen yüklenecektir. Bir koleksiyona başvurursak, ilk erişildiğinde yüklenecektir.

2.3 @LazyCollection notu

Daha önce gördüğünüz gibi, fetch parametresi koleksiyonlarla çalışırken pek yardımcı olmuyor. Hibernate'in yaratıcıları, özel bir ek açıklama ekleyerek bunu düzeltmeye çalıştı @LazyCollection. Genellikle şöyle yazılır:

@LazyCollection(LazyCollectionOption.TRUE)

Koleksiyon alanlarını eşlerken belirtmeniz gerekir:


@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.TRUE)
   public List<Comment> comments;
}

Bu açıklama, üç değerden birini alabilen bir değer parametresine sahiptir:

  • LazyCollectionOption. DOĞRU
  • LazyCollectionOption. YANLIŞ
  • LazyCollectionOption. EKSTRA

İlk iki seçenek, getirme seçeneğine çok benzer.

Parametre olarak ayarlanmışsa , üst Kullanıcı nesnesi yüklendiğinde LazyCollectionOption.TRUEyorum alanının değerlerinin veritabanından yüklenmeyeceği anlamına gelir. Yorum türündeki nesneler, yorumlar alanına ilk erişildiğinde yüklenecektir. Aslında, bu parametrenin karşılığıdır.FetchType.LAZY

Parametre olarak ayarlanmışsa , bu , üst Kullanıcı nesnesinin yüklenmesi sırasında LazyCollectionOption.FALSEyorum alanının değerlerinin veritabanından yükleneceği anlamına gelir . Yorum türündeki nesneler, yorumlar alanına ilk erişildiğinde yüklenecektir. Aslında, bu FetchType.EAGER.