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.