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.