CodeGym/Java tanfolyam/All lectures for HU purposes/Lusta betöltés a gyűjtemények feltérképezésekor

Lusta betöltés a gyűjtemények feltérképezésekor

Elérhető

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 @ManyToOneSZÜKSÉGES, az annotációkhoz @OneToManyés @ManyToManyLISTA. 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.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései