Vyhlásenie INSERT v JPA

1. Prehľad

V tomto rýchlom výučbe sa dozvieme, ako na to vykonať vyhlásenie INSERT na objektoch JPA.

Ak sa chcete dozvedieť viac informácií o režime dlhodobého spánku všeobecne, pozrite si nášho komplexného sprievodcu JPA s jarom a úvod do jarných údajov s JPA, kde sa môžete ponoriť do tejto témy.

2. Pretrvávajúce objekty v JPA

V JPA každý subjekt prechádzajúci z prechodného do riadeného stavu automaticky vybavuje EntityManager.

The EntityManager skontroluje, či daná entita už existuje, a potom rozhodne, či by sa mala vložiť alebo aktualizovať. Z dôvodu tejto automatickej správy tiba príkazy povolené JPA sú SELECT, UPDATE a ODSTRÁNIŤ.

V príkladoch nižšie sa pozrieme na rôzne spôsoby riadenia a obchádzania tohto obmedzenia.

3. Definovanie spoločného modelu

Teraz začnime definovaním jednoduchej entity, ktorú použijeme v tomto výučbe:

@Entity verejná trieda Osoba {@Id súkromná Long id; private String meno; private String priezvisko; // štandardné getre a setre, predvolené a all-args konštruktory}

Definujme tiež triedu úložiska, ktorú použijeme pre naše implementácie:

@Repository public class PersonInsertRepository {@PersistenceContext private EntityManager entityManager; }

Ďalej použijeme @ Transakčné anotácia na automatické spracovanie transakcií do jari. Takto sa nebudeme musieť starať o vytváranie transakcií s našimi EntityManager, vykonanie našich zmien alebo vykonanie vrátenia zmien ručne v prípade výnimky.

4. createNativeQuery

Pre ručne vytvorené dotazy môžeme použiť EntityManager # createNativeQuery metóda. Umožňuje nám vytvárať akékoľvek typy dotazov SQL, nielen tie, ktoré podporuje JPA. Pridajme do našej triedy úložiska novú metódu:

@Transactional public void insertWithQuery (Osoba osoba) {entityManager.createNativeQuery ("INSERT INTO person (id, first_name, last_name) VALUES (?,?,?)") .SetParameter (1, person.getId ()) .setParameter (2 , person.getFirstName ()) .setParameter (3, person.getLastName ()) .executeUpdate (); }

S týmto prístupom musíme definovať doslovný dotaz vrátane názvov stĺpcov a nastaviť ich zodpovedajúce hodnoty.

Teraz môžeme otestovať naše úložisko:

@Test public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown () {Osoba osoba = nová Osoba (1L, "meno", "priezvisko"); assertThatExceptionOfType (PersistenceException.class) .isThrownBy (() -> {personInsertRepository.insertWithQuery (PERSON); personInsertRepository.insertWithQuery (PERSON);}); }

V našom teste sa každá operácia pokúša vložiť nový záznam do našej databázy. Pretože sme sa pokúsili vložiť dve entity s rovnakými id, druhá operácia vloženia zlyhá hodením a PersistenceException.

Princíp je tu rovnaký, ak používame Spring Data @Dopyt.

5. pretrvávať

V našom predchádzajúcom príklade sme vytvorili vložené dotazy, ale pre každú entitu sme museli vytvoriť doslova dotazy. Tento prístup nie je príliš efektívny a vedie k mnohým štandardným kódom.

Namiesto toho môžeme využiť pretrvávať metóda z EntityManager.

Rovnako ako v našom predchádzajúcom príklade, rozšírme našu triedu úložiska o vlastnú metódu:

@Transactional public void insertWithEntityManager (Osoba osoba) {this.entityManager.persist (osoba); }

Teraz môžeme náš prístup znova otestovať:

@ Test public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown () {assertThatExceptionOfType (EntityExistsException.class) .isThrownBy (() -> {personInsertRepository.insertWithEntityManager "" "meno Priezvisko")); }); }

Na rozdiel od používania natívnych dotazov nemusíme zadávať názvy stĺpcov a zodpovedajúce hodnoty. Namiesto toho EntityManager to za nás vybavuje.

Vo vyššie uvedenom teste tiež očakávame EntityExistsException byť vyhodený namiesto svojej nadtriedy PersistenceException ktorý je viac špecializovaný a hádzaný tým pretrvávať.

Na druhej strane, v tomto príklade sa musíme ubezpečiť, že našu metódu vloženia zavoláme zakaždým s novou inštanciou Osoba.V opačnom prípade to už bude spravovať EntityManager, výsledkom je operácia aktualizácie.

6. Záver

V tomto článku sme ilustrovali spôsoby vykonávania operácií vloženia na objektoch JPA. Pozreli sme sa na príklady použitia natívneho dotazu, ako aj použitia EntityManager # persist na vytvorenie vlastných príkazov INSERT.

Úplný kód použitý v tomto článku je ako vždy k dispozícii na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found