@DynamicUpdate with Spring Data JPA
1. Áttekintés
Amikor a Spring Data JPA-t hibernált állapotban használjuk, használhatjuk a hibernálás további szolgáltatásait is. @DynamicUpdate az egyik ilyen jellemző.
@DynamicUpdate osztály szintű kommentár, amely alkalmazható a JPA entitásra. Biztosítja, hogy a Hibernate csak az SQL utasítás módosított oszlopait használja, amelyeket az entitás frissítéséhez generál.
Ebben a cikkben megnézzük a @DynamicUpdate annotáció, a segítségével Spring Data JPA példa.
2. JPA @Entity
Amikor egy alkalmazás elindul, a Hibernate generálja az SQL utasításokat az összes entitás CRUD műveleteihez. Ezeket az SQL utasításokat egyszer állítják elő, és a gyorsítótárba helyezik a memóriában a teljesítmény javítása érdekében.
A létrehozott SQL frissítési utasítás tartalmazza az entitás összes oszlopát. Ha frissítünk egy entitást, akkor a módosított oszlopok értékei átkerülnek az SQL frissítési utasításba. A nem frissített oszlopok esetében a hibernálás a meglévő értékeket használja a frissítéshez.
Próbáljuk megérteni ezt egy példával. Először vegyük figyelembe egy elnevezett JPA entitást Számla:
@Entity public class Account {@Id private int id; @ Oszlop privát karakterlánc neve; @Column private String típus; @Column privát logikai aktív; // Getters and Setters}
Ezután írjunk egy JPA-adattárat a Számla entitás:
@Repository nyilvános felület A AccountRepository kiterjeszti a JpaRepository {}
Most használjuk a AccountRepository hogy frissítse a név mező egy Számla tárgy:
Számlafiók = accountRepository.findOne (ACCOUNT_ID); account.setName ("Tesztfiók"); accountRepository.save (account);
A frissítés végrehajtása után ellenőrizhetjük a létrehozott SQL utasítást. A létrehozott SQL utasítás tartalmazza a Számla:
frissítés Fiókkészlet aktív = ?, név = ?, type =? ahol id =?
3. JPA @Entity val vel @DynamicUpdate
Láttuk, hogy annak ellenére, hogy módosítottuk a név Csak a Hibernate mezőben minden oszlop szerepel az SQL utasításban.
Most tegyük hozzá a @DynamicUpdate jegyzet a Számla entitás:
@Entity @DynamicUpdate public class Account {// Meglévő adatok és módszerek}
Ezután futtassuk ugyanazt a frissítési kódot, amelyet az előző szakaszban használtunk. Láthatjuk, hogy a Hibernate által generált SQL ebben az esetben csak az név oszlop:
frissítse a fiókkészlet nevét =? ahol id =?
Így, mi történik, amikor használjuk @DynamicUpdate egy entitáson?
Valójában, amikor használjuk @DynamicUpdate egy entitáson a Hibernate nem használja a gyorsítótárazott SQL utasítást a frissítéshez. Ehelyett SQL-utasítást generál minden alkalommal, amikor az entitást frissítjük. Ez a generált SQL csak a megváltozott oszlopokat tartalmazza.
A megváltozott oszlopok megismeréséhez a hibernálásnak nyomon kell követnie az aktuális entitás állapotát. Tehát, amikor egy entitás bármely mezőjét megváltoztatjuk, összehasonlítja az entitás aktuális és módosított állapotát.
Ez azt jelenti @DynamicUpdate teljesítmény-rezsi társul hozzá. Ezért csak akkor használjuk, amikor valóban szükséges.
Természetesen van néhány forgatókönyv, ahol ezt a kommentárt kell használnunk - például, ha egy entitás egy olyan táblázatot képvisel, amelynek nagy az oszlopainak száma, és csak néhány ilyen oszlopot kell gyakran frissíteni. Továbbá, ha verzió nélküli optimistás zárat használunk, akkor használnunk kell @DynamicUpdate.
4. Következtetés
Ebben az oktatóanyagban megvizsgáltuk a @DynamicUpdate Hibernate annotációja. Használtunk egy példát a Spring Data JPA-ra @DynamicUpdate akcióban. Megbeszéltük azt is, hogy mikor kell használnunk ezt a funkciót, és mikor nem.
Mint mindig, az ebben az oktatóanyagban használt teljes kódpéldák elérhetők a Githubon.