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 @OneToOne
och @ManyToOne
Àr EVIG, för kommentarer @OneToMany
och @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.TRUE
betyder 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.FALSE
betyder 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
.
GO TO FULL VERSION