@DynamicUpdate s jarnými údajmi JPA

1. Prehľad

Keď používame Spring Data JPA s Hibernate, môžeme využívať aj ďalšie funkcie Hibernate. @DynamicUpdate je jedna taká vlastnosť.

@DynamicUpdate je anotácia na úrovni triedy, ktorú je možné použiť na entitu JPA. Zaisťuje, že režim dlhodobého spánku použije na aktualizáciu entity iba upravené stĺpce v príkaze SQL, ktorý vygeneruje.

V tomto článku sa pozrieme na @DynamicUpdate anotácie, pomocou a Jarné údaje JPA príklad.

2. JPA @Entity

Keď sa spustí aplikácia, režim dlhodobého spánku vygeneruje príkazy SQL pre operácie CRUD všetkých entít. Tieto príkazy SQL sa generujú jednorazovo a na zlepšenie výkonu sa ukladajú do pamäte cache.

Vygenerovaný príkaz na aktualizáciu SQL obsahuje všetky stĺpce entity. V prípade, že aktualizujeme entitu, hodnoty upravených stĺpcov sa odovzdajú príkazu aktualizácie SQL. Pre stĺpce, ktoré sa neaktualizujú, použije režim dlhodobého spánku pre aktualizáciu svoje existujúce hodnoty.

Pokúsme sa to pochopiť na príklade. Najskôr zvážme pomenovanie entity JPA Účet:

@Entity účet verejnej triedy {@Id private int id; @ Názov stĺpca súkromného reťazca; @ Typ súkromného reťazca v stĺpci; @ Stĺpec private boolean aktívny; // Getters and Setters}

Ďalej napíšeme úložisko JPA pre Účet subjekt:

@Repository verejné rozhranie AccountRepository rozširuje JpaRepository {}

Teraz použijeme Úložisko účtov aktualizovať názov pole an Účet objekt:

Účet účtu = accountRepository.findOne (ACCOUNT_ID); account.setName ("Testovací účet"); accountRepository.save (účet);

Po vykonaní tejto aktualizácie môžeme overiť vygenerovaný príkaz SQL. Vygenerovaný príkaz SQL bude obsahovať všetky stĺpce Účet:

aktualizovať Sada účtov aktívna = ?, meno = ?, typ =? kde id =?

3. JPA @Entity s @DynamicUpdate

Videli sme to, aj keď sme upravili názov iba pole Hibernate zahrnul všetky stĺpce do príkazu SQL.

Teraz pridajme @DynamicUpdate anotácia k Účet subjekt:

@Entity @DynamicUpdate účet verejnej triedy {// Existujúce údaje a metódy}

Ďalej spustíme rovnaký aktualizačný kód, aký sme použili v predchádzajúcej časti. Vidíme, že SQL vygenerovaný režimom dlhodobého spánku v tomto prípade obsahuje iba názov stĺpec:

aktualizovať Názov sady účtov =? kde id =?

Takže čo sa stane, keď použijeme @DynamicUpdate na účtovnú jednotku?

Vlastne, keď používame @DynamicUpdate v entite, režim dlhodobého spánku nepoužíva na aktualizáciu príkaz SQL v pamäti. Namiesto toho vygeneruje príkaz SQL pri každej aktualizácii entity. Toto generovaný SQL obsahuje iba zmenené stĺpce.

Aby bolo možné zistiť zmenené stĺpce, režim dlhodobého spánku musí sledovať stav aktuálnej entity. Keď teda zmeníme ktorékoľvek pole entity, porovná sa súčasný a upravený stav entity.

To znamená, že @DynamicUpdate má s tým spojenú réžiu výkonu. Mali by sme ho preto používať, iba ak je to skutočne potrebné.

Určite existuje niekoľko scenárov, kedy by sme mali použiť túto anotáciu - napríklad ak entita predstavuje tabuľku, ktorá má veľký počet stĺpcov a vyžaduje sa častá aktualizácia iba niekoľkých z nich. Keď tiež používame optimistické uzamykanie bez verzie, musíme to použiť @DynamicUpdate.

4. Záver

V tomto návode sme sa pozreli na @DynamicUpdate anotácia režimu dlhodobého spánku. Použili sme príklad Spring Data JPA @DynamicUpdate v akcii. Diskutovali sme tiež o tom, kedy by sme mali používať túto funkciu a kedy by sme nemali.

Kompletné príklady kódu použité v tomto tutoriále sú ako vždy k dispozícii na stránkach Github.