INSERT Izjava u JPA

1. Pregled

U ovom brzom vodiču naučit ćemo kako izvesti INSERT izraz na JPA objektima.

Za više informacija o hibernaciji općenito, pogledajte naš opsežni vodič za JPA s proljećem i uvod u proljetne podatke s JPA za dublja zarona u ovu temu.

2. Postojani objekti u JPA

U JPA-u svaki entitet koji prelazi iz prijelaznog u upravljano stanje automatski obrađuje EntityManager.

The EntityManager provjerava postoji li zadani entitet, a zatim odlučuje treba li ga umetnuti ili ažurirati. Zbog ovog automatskog upravljanja, tsamo su izjave koje dopušta JPA: SELECT, UPDATE i IZBRISATI.

U primjerima u nastavku razmotrit ćemo različite načine upravljanja i zaobilaženja ovog ograničenja.

3. Definiranje zajedničkog modela

Sada, krenimo s definiranjem jednostavnog entiteta koji ćemo koristiti u ovom vodiču:

@ Entitet javna klasa Osoba {@ Id privatno Long id; private String firstName; private String lastName; // standardni getteri i postavljači, zadani i all-args konstruktori}

Također, definirajmo klasu spremišta koju ćemo koristiti za naše implementacije:

@Repository javna klasa PersonInsertRepository {@PersistenceContext private EntityManager entityManager; }

Uz to ćemo primijeniti @Transational napomena za automatsko rukovanje transakcijama do proljeća. Na ovaj način se nećemo morati brinuti o stvaranju transakcija s našim EntityManager, izvršavanje naših promjena ili ručno izvršavanje vraćanja u slučaju iznimke.

4. createNativeQuery

Za ručno kreirane upite možemo koristiti EntityManager # createNativeQuery metoda. Omogućuje nam stvaranje bilo koje vrste SQL upita, ne samo onih koje podržava JPA. Dodajmo novu metodu u našu klasu spremišta:

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

Ovim pristupom moramo definirati doslovni upit koji uključuje imena stupaca i postaviti odgovarajuće vrijednosti.

Sada možemo testirati naše spremište:

@Test javna praznina givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown () {Osoba osoba = nova Osoba (1L, "ime", "prezime"); assertThatExceptionOfType (PersistenceException.class) .isThrownBy (() -> {personInsertRepository.insertWithQuery (OSOBA); personInsertRepository.insertWithQuery (OSOBA);}); }

U našem testu svaka operacija pokušava umetnuti novi unos u našu bazu podataka. Budući da smo pokušali umetnuti dva entiteta s istim iskaznica, druga operacija umetanja ne uspije bacajući a PerzistentnostIznimka.

Ovdje je princip isti ako koristimo Spring Data's @Query.

5. ustrajati

U našem prethodnom primjeru stvorili smo upite za umetanje, ali morali smo stvoriti doslovne upite za svaki entitet. Ovaj pristup nije vrlo učinkovit i rezultira velikim brojem šifara.

Umjesto toga, možemo se poslužiti ustrajati metoda iz EntityManager.

Kao u našem prethodnom primjeru, proširimo klasu spremišta prilagođenom metodom:

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

Sada možemo ponovno testirati svoj pristup:

@Test public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown () {assertThatExceptionOfType (EntityExistsException.class) .isThrownBy (() -> {personInsertRepository.insertWithEntityManager (nova osoba (1L "FIRSTNAME", "prezime")); personInsertRepository.insertWithEntityManager (nova osoba (1L, "ime prezime")); }); }

Za razliku od upotrebe izvornih upita, ne moramo navesti imena stupaca i odgovarajuće vrijednosti. Umjesto toga, EntityManager obrađuje to za nas.

U gore navedenom testu također očekujemo EntityExistsException biti bačen umjesto svoje superrazrede PerzistentnostIznimka koji je specijaliziraniji i bačen od strane ustrajati.

S druge strane, u ovom primjeru to moramo osigurati našu metodu umetanja pozivamo svaki put s novom instancom Osoba.U suprotnom, njime će već upravljati EntityManager, što rezultira operacijom ažuriranja.

6. Zaključak

U ovom smo članku ilustrirali načine izvođenja operacija umetanja JPA objekata. Pogledali smo primjere korištenja izvornog upita, kao i korištenje EntityManager # traje za stvaranje prilagođenih INSERT izraza.

Kao i uvijek, cjeloviti kôd korišten u ovom članku dostupan je na GitHubu.