CodeGym/Java Course/All lectures for NL purposes/Lazy Loading bij het in kaart brengen van collecties

Lazy Loading bij het in kaart brengen van collecties

Beschikbaar

2.1 ophaaloptie

De ontwikkelaars van Hibernate zijn al lang op de hoogte van het probleem met het laden van onderliggende entiteiten. Dus het eerste wat ze deden was een speciale fetch parameter toevoegen aan de annotaties @OneToMany, @ManyToMany.

Deze parameter kan twee waarden aannemen:

  • GRETIG
  • LUI

Voorbeeld:

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

Als de parameter fetch gelijk is aan EAGER , worden alle onderliggende entiteiten ook geladen wanneer de bovenliggende entiteit wordt geladen. Hibernate zal ook proberen het in één SQL-query te doen, een flinke query te genereren en alle gegevens in één keer te krijgen.

Als de parameter fetch de waarde LAZY aanneemt , wordt de onderliggende entiteit niet geladen wanneer de bovenliggende entiteit wordt geladen. In plaats daarvan wordt een proxy-object gemaakt.

Met behulp van dit proxy-object zal Hibernate de toegang tot deze onderliggende entiteit volgen en deze bij de eerste keer openen in het geheugen laden.

Als we onze situatie herinneren met opmerkingen:

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

Dan heb je een “chique keuze”:

Als fetch = FetchType.EAGER, dan laadt Hibernate alle opmerkingen op de 1e regel code:

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

Als fetch = FetchType.LAZY, dan laadt Hibernate alle opmerkingen op de 2e regel code:

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

Zoals je al kunt raden, heb je geen optie als niet alle reacties worden geladen :)

2.2 Standaardwaarde

Als u geen ophaaloptie opgeeft voor de @ManyToannotatie ..., gebruikt Hibernate de standaardwaarden.

Ze verschillen enigszins voor verschillende annotatietypen. Voor annotaties @OneToOneen @ManyToOneis EAGER, voor annotaties @OneToManyen @ManyToManyis LAZY. Het is gemakkelijk te onthouden - als we naar één object verwijzen, wordt het volledig geladen. Als we naar een verzameling verwijzen, wordt deze de eerste keer dat deze wordt geopend, geladen.

2.3 @LazyCollection-annotatie

Zoals je al hebt gezien, helpt de fetch-parameter niet veel bij het werken met collecties. De makers van Hibernate hebben geprobeerd dit op te lossen door een speciale annotatie toe te voegen @LazyCollection. Het wordt meestal zo geschreven:

@LazyCollection(LazyCollectionOption.TRUE)

U moet dit specificeren bij het toewijzen van verzamelingsvelden:

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.TRUE)
   public List<Comment> comments;
}

Deze annotatie heeft een waardeparameter die een van de volgende drie waarden kan aannemen:

  • LazyCollectionOptie. WAAR
  • LazyCollectionOptie. ONWAAR
  • LazyCollectionOptie. EXTRA

De eerste twee opties lijken sterk op de ophaaloptie.

Als de parameter is ingesteld op LazyCollectionOption.TRUE, betekent dit dat de waarden van het opmerkingenveld niet uit de database worden geladen wanneer het bovenliggende gebruikersobject wordt geladen. Objecten van het type Commentaar worden geladen wanneer het commentaarveld voor het eerst wordt geopend. In feite is dit het equivalent van de parameterFetchType.LAZY

Als de parameter is ingesteld op LazyCollectionOption.FALSE, betekent dit dat de waarden van het commentaarveld uit de database worden geladen op het moment dat het bovenliggende gebruikersobject wordt geladen. Objecten van het type Commentaar worden geladen wanneer het commentaarveld voor het eerst wordt geopend. In feite is dit het equivalent van de FetchType.EAGER.

Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen