CodeGym/Java kursus/All lectures for DA purposes/Lazy Loading ved kortlægning af samlinger

Lazy Loading ved kortlægning af samlinger

Ledig

2.1 hente mulighed

Udviklerne af Hibernate har kendt til problemet med at indlæse underordnede enheder i lang tid. Så det første de gjorde var at tilføje en speciel henteparameter til annoteringerne @OneToMany.@ManyToMany

Denne parameter kan have to værdier:

  • IVRIGE
  • DOVEN

Eksempel:

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

Hvis hente-parameteren er lig med EAGER , vil alle dens underordnede entiteter også blive indlæst, når den overordnede enhed er indlæst. Hibernate vil også forsøge at gøre det i én SQL-forespørgsel, generere en heftig forespørgsel og hente alle data på én gang.

Hvis hente-parameteren tager værdien LAZY , vil den underordnede enhed ikke blive indlæst, når den overordnede enhed er indlæst. I stedet oprettes et proxyobjekt.

Ved hjælp af dette proxy-objekt vil Hibernate spore adgangen til denne underordnede enhed og indlæse den i hukommelsen, første gang den tilgås.

Hvis vi husker vores 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;
}

Så har du et "chik valg":

Hvis fetch = FetchType.EAGER, så vil Hibernate indlæse alle kommentarer på 1. kodelinje:

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

Hvis fetch = FetchType.LAZY, så vil Hibernate indlæse alle kommentarerne på 2. kodelinje:

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

Som du allerede kan gætte, har du ingen mulighed, når den ikke indlæser alle kommentarer :)

2.2 Standardværdi

Hvis du ikke angiver en hente-indstilling for @ManyTo...-annotationen, vil Hibernate bruge standardværdierne.

De er lidt forskellige for forskellige annoteringstyper. Til annoteringer @OneToOneog @ManyToOneer ivrig, til annoteringer @OneToManyog @ManyToManyer DOV. Det er nemt at huske - hvis vi henviser til et objekt, så vil det blive indlæst fuldstændigt. Hvis vi henviser til en samling, vil den blive indlæst første gang, den tilgås.

2.3 @LazyCollection annotation

Som du allerede har set, hjælper apportparameteren ikke meget, når du arbejder med samlinger. Skaberne af Hibernate forsøgte at rette dette ved at tilføje en speciel annotation @LazyCollection. Det er normalt skrevet sådan:

@LazyCollection(LazyCollectionOption.TRUE)

Du skal angive det, når du kortlægger samlingsfelter:

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

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

Denne annotering har en værdiparameter, der kan have en af ​​tre værdier:

  • LazyCollectionOption. RIGTIGT
  • LazyCollectionOption. FALSK
  • LazyCollectionOption. EKSTRA

De første to muligheder minder meget om hente-indstillingen.

Hvis parameteren er sat til LazyCollectionOption.TRUE, betyder det, at værdierne i kommentarfeltet ikke indlæses fra databasen, når det overordnede brugerobjekt indlæses. Objekter af typen Kommentar indlæses første gang, kommentarfeltet åbnes. Faktisk svarer dette til parameterenFetchType.LAZY

Hvis parameteren er indstillet til LazyCollectionOption.FALSE, betyder det, at værdierne i kommentarfeltet vil blive indlæst fra databasen på tidspunktet for indlæsning af det overordnede brugerobjekt. Objekter af typen Kommentar indlæses første gang, kommentarfeltet åbnes. Faktisk svarer dette til FetchType.EAGER.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu