2.1 opsyon sa pagkuha

Matagal nang alam ng mga developer ng Hibernate ang problema sa pag-load ng mga child entity. Kaya ang unang bagay na ginawa nila ay magdagdag ng isang espesyal na parameter ng pagkuha sa mga anotasyon @OneToMany, @ManyToMany.

Ang parameter na ito ay maaaring tumagal ng dalawang halaga:

  • SAbik
  • TAMAD

Halimbawa:

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

Kung ang parameter ng fetch ay katumbas ng EAGER , kapag na-load ang parent entity, ilo-load din ang lahat ng child entity nito. Gayundin, susubukan ng Hibernate na gawin ito sa isang SQL query, na bumubuo ng isang mabigat na query at kinukuha ang lahat ng data nang sabay-sabay.

Kung kinuha ng parameter ng fetch ang value na LAZY , kapag na-load ang parent na entity, hindi malo-load ang child entity. Sa halip, isang proxy object ang gagawin.

Sa tulong ng proxy object na ito, susubaybayan ng Hibernate ang access sa child entity na ito at ilo-load ito sa memorya sa unang pagkakataong ma-access ito.

Kung naaalala natin ang ating sitwasyon na may mga komento:


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

Pagkatapos ay mayroon kang "chic choice":

Kung fetch = FetchType.EAGER, pagkatapos ay ilo-load ng Hibernate ang lahat ng komento sa unang linya ng code:

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

Kung fetch = FetchType.LAZY, pagkatapos ay ilo-load ng Hibernate ang lahat ng mga komento sa ika-2 linya ng code:

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

Tulad ng maaari mo nang hulaan, wala kang pagpipilian kapag hindi nito na-load ang lahat ng mga komento :)

2.2 Default na halaga

Kung hindi ka tumukoy ng opsyon sa pagkuha para sa @ManyTo... annotation, gagamitin ng Hibernate ang mga default na value.

Bahagyang naiiba ang mga ito para sa iba't ibang uri ng anotasyon. Para sa mga anotasyon @OneToOneat @ManyToOnesabik, para sa mga anotasyon @OneToManyat @ManyToManyTAMAD. Madaling tandaan - kung tumukoy tayo sa isang bagay, ganap itong mai-load. Kung sasangguni tayo sa isang koleksyon, mailo-load ito sa unang pagkakataong ma-access ito.

2.3 @LazyCollection annotation

Gaya ng nakita mo na, hindi gaanong nakakatulong ang fetch parameter kapag nagtatrabaho sa mga koleksyon. Sinubukan ng mga tagalikha ng Hibernate na ayusin ito sa pamamagitan ng pagdaragdag ng isang espesyal na anotasyon @LazyCollection. Karaniwan itong nakasulat tulad nito:

@LazyCollection(LazyCollectionOption.TRUE)

Kailangan mong tukuyin ito kapag nagmamapa ng mga field ng koleksyon:


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

Ang anotasyong ito ay may isang parameter ng halaga na maaaring tumagal ng isa sa tatlong mga halaga:

  • LazyCollectionOption. TOTOO
  • LazyCollectionOption. MALI
  • LazyCollectionOption. EXTRA

Ang unang dalawang opsyon ay halos kapareho sa opsyon sa pagkuha.

Kung ang parameter ay nakatakda sa LazyCollectionOption.TRUE, nangangahulugan ito na ang mga halaga ng field ng mga komento ay hindi mailo-load mula sa database kapag na-load ang parent User object. Ang mga bagay na may uri ng Komento ay ilo-load sa unang pagkakataon na ma-access ang field ng mga komento. Sa katunayan, ito ang katumbas ng parameterFetchType.LAZY

Kung ang parameter ay nakatakda sa LazyCollectionOption.FALSE, nangangahulugan ito na ang mga halaga ng field ng mga komento ay mailo -load mula sa database sa oras ng paglo-load ng parent User object. Ang mga bagay na may uri ng Komento ay ilo-load sa unang pagkakataon na ma-access ang field ng mga komento. Sa katunayan, ito ang katumbas ng FetchType.EAGER.