CodeGym /Kurser /SQL & Hibernate /Lata laddar vid kartlÀggning av samlingar

Lata laddar vid kartlÀggning av samlingar

SQL & Hibernate
NivÄ , Lektion
TillgÀngliga

2.1 hÀmtningsalternativ

Utvecklarna av Hibernate har kÀnt till problemet med att ladda underordnade enheter under lÄng tid. SÄ det första de gjorde var att lÀgga till en speciell hÀmtningsparameter till annoteringarna @OneToMany, @ManyToMany.

Denna parameter kan ha tvÄ vÀrden:

  • IVRIG
  • LAT

Exempel:

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

Om hÀmta-parametern Àr lika med EAGER kommer alla dess underordnade entiteter ocksÄ att laddas nÀr den överordnade entiteten laddas. Hibernate kommer ocksÄ att försöka göra det i en SQL-frÄga, generera en rejÀl frÄga och fÄ all data pÄ en gÄng.

Om hÀmta-parametern tar vÀrdet LAZY , kommer den underordnade enheten inte att laddas nÀr den överordnade enheten laddas. IstÀllet skapas ett proxyobjekt.

Med hjÀlp av detta proxyobjekt kommer Hibernate att spÄra Ätkomsten till denna underordnade enhet och ladda den i minnet första gÄngen den anvÀnds.

Om vi ​​minns vĂ„r situation med kommentarer:


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

DĂ„ har du ett "chic val":

Om fetch = FetchType.EAGER, sÄ kommer Hibernate att lÀsa in alla kommentarer pÄ den första kodraden:

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

Om fetch = FetchType.LAZY, kommer Hibernate att ladda alla kommentarer pÄ den andra raden med kod:

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

Som du redan kan gissa har du inget val nÀr det inte laddar alla kommentarer :)

2.2 StandardvÀrde

Om du inte anger ett hÀmtningsalternativ för @ManyTo...-anteckningen kommer Hibernate att anvÀnda standardvÀrdena.

De Ă€r nĂ„got olika för olika anteckningstyper. För kommentarer @OneToOneoch @ManyToOneĂ€r EVIG, för kommentarer @OneToManyoch @ManyToManyĂ€r LAT. Det Ă€r lĂ€tt att komma ihĂ„g - om vi hĂ€nvisar till ett objekt kommer det att laddas helt. Om vi ​​hĂ€nvisar till en samling kommer den att laddas första gĂ„ngen den öppnas.

2.3 @LazyCollection-anteckning

Som du redan har sett hjÀlper parametern hÀmta inte mycket nÀr du arbetar med samlingar. Skaparna av Hibernate försökte fixa detta genom att lÀgga till en speciell kommentar @LazyCollection. Det brukar skrivas sÄ hÀr:

@LazyCollection(LazyCollectionOption.TRUE)

Du mÄste ange det nÀr du kartlÀgger samlingsfÀlt:


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

Den hÀr kommentaren har en vÀrdeparameter som kan ha ett av tre vÀrden:

  • LazyCollectionOption. SANN
  • LazyCollectionOption. FALSK
  • LazyCollectionOption. EXTRA

De tvÄ första alternativen Àr mycket lika hÀmtningsalternativet.

Om parametern Àr instÀlld pÄ LazyCollectionOption.TRUEbetyder det att vÀrdena i kommentarfÀltet inte kommer att laddas frÄn databasen nÀr det överordnade anvÀndarobjektet laddas. Objekt av typen Kommentar kommer att laddas första gÄngen kommentarsfÀltet öppnas. I sjÀlva verket Àr detta motsvarigheten till parameternFetchType.LAZY

Om parametern Àr instÀlld pÄ LazyCollectionOption.FALSEbetyder det att vÀrdena för kommentarsfÀltet kommer att laddas frÄn databasen nÀr det överordnade anvÀndarobjektet laddas. Objekt av typen Kommentar kommer att laddas första gÄngen kommentarsfÀltet öppnas. I sjÀlva verket Àr detta motsvarigheten till FetchType.EAGER.

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION