INSERT-erklæring i JPA

1. Oversigt

I denne hurtige vejledning lærer vi at gøre det udføre en INSERT-erklæring på JPA-objekter.

For mere information om dvale generelt, se vores omfattende guide til JPA med Spring og introduktion til Spring Data med JPA for dybe dyk i dette emne.

2. Vedvarende objekter i JPA

I JPA håndteres hver enhed, der går fra en forbigående til administreret tilstand automatisk af EntityManager.

Det EntityManager kontrollerer, om en given enhed allerede eksisterer, og beslutter derefter, om den skal indsættes eller opdateres. På grund af denne automatiske styring, than kun udsagn tilladt af JPA er SELECT, UPDATE og SLET.

I eksemplerne nedenfor ser vi på forskellige måder at styre og omgå denne begrænsning på.

3. Definition af en fælles model

Lad os nu starte med at definere en simpel enhed, som vi bruger i hele denne tutorial:

@Entity offentlig klasse person {@Id privat Lang id; privat streng fornavn; privat streng efternavn; // standard getters og setters, standard- og all-args-konstruktører}

Lad os også definere en lagerklasse, som vi bruger til vores implementeringer:

@Repository offentlig klasse PersonInsertRepository {@PersistenceContext private EntityManager entityManager; }

Derudover anvender vi @Transaktionel kommentar til automatisk at håndtere transaktioner inden foråret. På denne måde behøver vi ikke bekymre os om at oprette transaktioner med vores EntityManager, begå vores ændringer eller udføre tilbageførsel manuelt i tilfælde af en undtagelse.

4. createNativeQuery

For manuelt oprettede forespørgsler kan vi bruge EntityManager # createNativeQuery metode. Det giver os mulighed for at oprette enhver type SQL-forespørgsel, ikke kun dem, der understøttes af JPA. Lad os tilføje en ny metode til vores lagerklasse:

@Transactional 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 (); }

Med denne tilgang er vi nødt til at definere en bogstavelig forespørgsel, der inkluderer navnene på kolonnerne og indstille deres tilsvarende værdier.

Vi kan nu teste vores lager:

@Test offentlig ugyldighed givetPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown () {Person person = ny person (1L, "fornavn", "efternavn"); assertThatExceptionOfType (PersistenceException.class) .isThrownBy (() -> {personInsertRepository.insertWithQuery (PERSON); personInsertRepository.insertWithQuery (PERSON);}); }

I vores test forsøger hver operation at indsætte en ny post i vores database. Da vi forsøgte at indsætte to enheder med det samme id, mislykkes den anden indsats ved at smide a PersistenceException.

Princippet her er det samme, hvis vi bruger Spring Data's @Forespørgsel.

5. vedvarer

I vores tidligere eksempel oprettede vi indsætningsforespørgsler, men vi var nødt til at oprette bogstavelige forespørgsler for hver enhed. Denne tilgang er ikke særlig effektiv og resulterer i en masse kedelpladekode.

I stedet kan vi gøre brug af vedvarer metode fra EntityManager.

Som i vores tidligere eksempel, lad os udvide vores arkivklasse med en brugerdefineret metode:

@Transactional public void insertWithEntityManager (Person person) {this.entityManager.persist (person); }

Nu kan vi teste vores tilgang igen:

@Test public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown () {assertThatExceptionOfType (EntityExistsException.class) .isThrownBy (() -> {personInsertRepository.insertWithEntityManager (ny person (1L, "fornavn", "efternavn")); personInsertRepository.insertWithEntityManager (ny person (1L, "fornavn efternavn")); }); }

I modsætning til at bruge indfødte forespørgsler, vi behøver ikke at specificere kolonnenavne og tilsvarende værdier. I stedet, EntityManager håndterer det for os.

I ovenstående test forventer vi også EntityExistsException at blive kastet i stedet for sin superklasse PersistenceException som er mere specialiseret og kastet af vedvarer.

På den anden side skal vi i dette eksempel sørge for det vi kalder vores indsætningsmetode hver gang med en ny forekomst af Person.Ellers administreres det allerede af EntityManager, hvilket resulterer i en opdateringshandling.

6. Konklusion

I denne artikel illustrerede vi måder at udføre indsættelseshandlinger på JPA-objekter på. Vi kiggede på eksempler på brug af en indfødt forespørgsel samt brug af EntityManager # vedvarer for at oprette brugerdefinerede INSERT-sætninger.

Som altid er den komplette kode, der bruges i denne artikel, tilgængelig på GitHub.


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