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 @OneToOne
og @ManyToOne
er ivrig, til annoteringer @OneToMany
og @ManyToMany
er 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
.
GO TO FULL VERSION