2.1 letöltési lehetőség
A Hibernate fejlesztői már régóta tudnak az utód entitások betöltésével kapcsolatos problémáról. Tehát az első dolguk az volt, hogy hozzáadtak egy speciális lekérési paramétert a megjegyzésekhez @OneToMany
, @ManyToMany
.
Ez a paraméter két értéket vehet fel:
- MOHÓ
- LUSTA
Példa:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
Ha a lekérési paraméter egyenlő az EAGER értékkel , akkor a szülő entitás betöltésekor az összes utód entitása is betöltődik. Ezenkívül a Hibernate egy SQL-lekérdezésben próbálja meg ezt megtenni, és egy izmos lekérdezést generál, és egyszerre kapja meg az összes adatot.
Ha a lekérési paraméter LAZY értéket vesz fel , akkor a szülő entitás betöltésekor az utód entitás nem töltődik be. Ehelyett egy proxy objektum jön létre.
Ennek a proxyobjektumnak a segítségével a Hibernate nyomon követi a gyermek entitás elérését, és az első hozzáféréskor betölti a memóriába.
Ha megjegyzésekkel idézzük fel helyzetünket:
@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;
}
Akkor van egy „elegáns választás”:
Ha fetch = FetchType.EAGER
, akkor a Hibernate betölti az összes megjegyzést az 1. kódsorban:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
Ha fetch = FetchType.LAZY
, akkor a Hibernate betölti az összes megjegyzést a 2. kódsorban:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
Ahogy azt már sejted, nincs lehetőséged, ha nem tölti be az összes megjegyzést :)
2.2 Alapértelmezett érték
Ha nem ad meg lekérési beállítást a @ManyTo
... megjegyzéshez, akkor a Hibernate az alapértelmezett értékeket fogja használni.
Kissé eltérnek a különböző megjegyzéstípusoknál. A kommentárokhoz @OneToOne
és @ManyToOne
SZÜKSÉGES, az annotációkhoz @OneToMany
és @ManyToMany
LISTA. Könnyű megjegyezni - ha egy objektumra hivatkozunk, akkor az teljesen betöltődik. Ha egy gyűjteményre hivatkozunk, akkor az az első hozzáféréskor töltődik be.
2.3 @LazyCollection megjegyzés
Mint már láthatta, a lekérési paraméter nem sokat segít a gyűjteményekkel való munka során. A Hibernate készítői egy speciális megjegyzés hozzáadásával próbálták ezt orvosolni @LazyCollection
. Általában így írják:
@LazyCollection(LazyCollectionOption.TRUE)
A gyűjteménymezők hozzárendelésénél meg kell adnia:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
Ennek a megjegyzésnek van egy értékparamétere, amely három érték egyikét veheti fel:
- LazyCollectionOption. IGAZ
- LazyCollectionOption. HAMIS
- LazyCollectionOption. KÜLÖN
Az első két lehetőség nagyon hasonlít a lekérési opcióhoz.
Ha a paraméter értéke LazyCollectionOption.TRUE
, az azt jelenti, hogy a megjegyzésmező értékei nem töltődnek be az adatbázisból a szülő felhasználói objektum betöltésekor. A Comment típusú objektumok a megjegyzésmező első elérésekor töltődnek be. Valójában ez a paraméter megfelelőjeFetchType.LAZY
Ha a paraméter értéke LazyCollectionOption.FALSE
, az azt jelenti, hogy a megjegyzés mező értékei a szülő felhasználói objektum betöltésekor töltődnek be az adatbázisból . A Comment típusú objektumok a megjegyzésmező első elérésekor töltődnek be. Valójában ez a megfelelője a FetchType.EAGER
.
GO TO FULL VERSION