Spring Data JPA @Modifying Annotation

1. Úvod

V tomto krátkom návode sa dozvieme, ako vytvoriť aktualizačné dotazy pomocou Spring Data JPA @Dopyt anotácia. Dosiahneme to použitím @ Úpravy anotácia.

Najskôr si osviežime pamäť a uvidíme, ako robiť dotazy pomocou Spring Data JPA. Potom sa hlboko ponoríme do používania @Dopyt a @ Úpravy anotácie. Nakoniec uvidíme, ako spravovať stav nášho kontextu perzistencie pri použití modifikujúcich dotazov.

2. Dopyty na jar v JPA

Najprv si pripomeňme 3 mechanizmy, ktoré Spring Data JPA poskytuje na dopytovanie údajov v databáze:

  • Metódy dopytovania
  • @Dopyt anotácia
  • Implementácia vlastného úložiska

Vytvorme a Používateľ triedy a zodpovedajúce úložisko Spring Data JPA na ilustráciu týchto mechanizmov:

@Entity @Table (name = "users", schema = "users") verejná trieda User {@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private int id; súkromné ​​meno reťazca; private LocalDate creationDate; private LocalDate lastLoginDate; súkromný booleovský aktívny; súkromný reťazcový e-mail; }
verejné rozhranie UserRepository rozširuje JpaRepository {}

Mechanizmus metód dotazovania nám umožňuje manipulovať s údajmi odvodením dotazov od názvov metód:

Zoznam findAllByName (názov reťazca); void deleteAllByCreationDateAfter (LocalDate date);

V tomto príklade môžeme nájsť dotaz, ktorý získa používateľov podľa ich mien, alebo ešte dotaz, ktorý odstráni používateľov, ktorí majú dátum vytvorenia po určitom dátume.

Pokiaľ ide o @Dopyt anotácia, poskytuje nám možnosť zapísať konkrétny dotaz JPQL alebo SQL do súboru @Dopyt anotácia:

@Query ("vyberte u z Používateľ u, kde u.email ako '%@gmail.com'") Zoznam findUsersWithGmailAddress ();

V tomto útržku kódu vidíme dotaz, ktorý načítava používateľov, ktorí majú znak @ gmail.com emailová adresa.

Prvý mechanizmus nám umožňuje načítať alebo vymazať údaje. Pokiaľ ide o druhú, umožňuje nám vykonať v podstate akýkoľvek dotaz. Avšak pre aktualizáciu dotazov musíme pridať @ Úpravy anotácia. Toto bude témou tohto tutoriálu.

3. Pomocou @ Úpravy Anotácia

The @ Úpravy anotácia sa používa na vylepšenie @Dopyt anotáciu vykonať nielen VYBERTE dotazy ale aj VLOŽTE, AKTUALIZÁCIA, ODSTRÁNIŤ, a dokonca DDL dotazy.

Poďme sa trochu pohrať s touto anotáciou a pozrime sa, z čoho je vyrobená.

Najprv sa pozrime na príklad a @ Úpravy UPDATE dopyt:

@Modifying @Query ("update User u set u.active = false where u.lastLoginDate <: date") void deactivateUsersNotLoggedInSince (@Param ("date") LocalDate date);

Tu deaktivujeme používateľov, ktorí sa od daného dátumu neprihlásili.

Skúsme inú, kde odstránime deaktivovaných používateľov:

@Modifying @Query ("delete User u where u.active = false") int deleteDeactivatedUsers ();

Ako vidíme, táto metóda vracia celé číslo. Je to vlastnosť Spring Data JPA @ Úpravy dotazy, ktoré nám poskytujú počet aktualizovaných entít.

Mali by sme na vedomie, že vykonanie mazacieho dotazu pomocou @Dopyt funguje inak ako Spring Data JPA deleteBy metódy dotazu odvodené od názvu. Ten najskôr načíta entity z databázy a potom ich jeden po druhom vymaže. To znamená, že ide o metódu životného cyklu @PreRemove budú vyzvané tieto subjekty. Avšak pri prvom menovanom sa vykoná jeden dotaz proti databáze.

Na záver pridajme a vypúšťa sa stĺpec k nášmu POUŽÍVATELIA stôl s a DDL dopyt:

@Modifying @Query (value = "alter table USERS.USERS add column deleted int (1) not null default 0", nativeQuery = true) void addDeletedColumn ();

Používanie dotazov na úpravu však nanešťastie ponecháva základný kontext pretrvávania zastaraný. Je však možné túto situáciu zvládnuť. To je predmetom nasledujúcej časti.

4. Správa kontextu perzistencie

Ak náš modifikujúci dopyt zmení entity obsiahnuté v kontexte perzistencie, potom bude tento kontext zastaraný. Jedným zo spôsobov, ako túto situáciu zvládnuť, je vyčistiť kontext pretrvávania. Týmto zaistíme, že kontext vytrvalosti nabudúce načíta entity z databázy.

Nemusíme však výslovne volať jasný() metóda na EntityManager. Môžeme len použiť jasnéAutomaticky majetok z @ Úpravy anotácia:

@Modifying (clearAutomatically = true)

Týmto spôsobom zabezpečíme, aby sa po vykonaní nášho dotazu vyčistil kontext pretrvávania.

Čo by sa však stalo, keby náš kontext vytrvalosti obsahoval nerušené zmeny? Jeho vyčistenie by teda znamenalo zrušenie neuložených zmien. Našťastie existuje ešte jedna vlastnosť anotácie, ktorú môžeme použiť - flushAutomatically:

@Modifying (flushAutomatically = true)

Teraz EntityManager je vyprázdnený pred vykonaním nášho dotazu.

5. Záver

Týmto sa uzatvára tento krátky článok o @ Úpravy anotácia. Už sme videli, ako použiť túto anotáciu na vykonanie aktualizačných dotazov, ako je VLOŽIŤ, AKTUALIZOVAŤ, ODSTRÁNIŤ, a dokonca DDL. Potom sme sa naučili, ako riadiť stav kontextu vytrvalosti pomocou jasnéAutomaticky a flushAutomatically vlastnosti.

Celý kód tohto článku je ako obvykle k dispozícii na serveri GitHub.