En guide til lagrede procedurer med JPA

1. Introduktion

I denne hurtige vejledning udforsker vi brugen af ​​lagrede procedurer i Java Persistence API (JPA).

2. Opsætning af projekt

2.1. Maven opsætning

Vi skal først definere følgende afhængigheder i vores pom.xml:

  • javax.javaee-api - da det inkluderer JPA API
  • en JPA API-implementering - i dette eksempel bruger vi Dvale, men EclipseLink ville også være et OK alternativ
  • -en MySQL Database
 7,0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} leveret org. Dvale dvaletilstand $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. Persistence Unit Definition

Det andet trin er oprettelsen af src / main / resources / META-INF / persistence.xml fil - som indeholder definitionerne på persistensenheden:

   org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.model.Car 

Alle definerede dvaleegenskaber er ikke nødvendige, hvis du henviser til en JNDI DataSource (JEE-miljøer):

java: jboss / datakilder / JpaStoredProcedure

2.3. Tabel Oprettelse Script

Lad os nu oprette en Tabel (CAR) - med tre attributter: ID, MODEL og ÅR:

Opret TABEL `bil` (` ID` int (10) IKKE NULL AUTO_INCREMENT, `MODEL` varchar (50) IKKE NULL,` YEAR` int (4) IKKE NUL, PRIMÆR NØGLE (`ID`)) MOTOR = InnoDB AUTO_INCREMENT = 2 STANDARD CHARSET = utf8;

Antagelsen var naturligvis, at DB-skemaet og tilladelserne allerede er på plads.

2.4. Lagret procedure Oprettelse på DB

Det sidste trin inden hoppe til java-koden er oprettelsen af ​​den lagrede procedure i vores MySQL-database:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` PROCEDURE `FIND_CAR_BY_YEAR` (i p_year int) begynder VÆLG ID, MODEL, ÅR FRA BIL, HVOR ÅR = p_year; afslut $$ DELIMITER;

3. JPA's lagrede procedure

Vi er nu klar til at bruge JPA til at kommunikere med databasen og udføre den lagrede procedure, vi definerede.

Når vi har gjort det, vil vi også kunne gentage resultaterne som en Liste af Bil.

3.1. Det Bil Enhed

Under Bil enhed, der godt skal kortlægges til BIL databasetabel af Entity Manager.

Bemærk, at vi også definerer vores lagrede procedure direkte på enheden ved hjælp af @NamedStoredProcedureQueries kommentar:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parametre = {@StoredPearcedProcedure) type = Integer.class, mode = ParameterMode.IN)}}}) offentlig klasse bil {privat lang id; privat streng model; privat helår; public Car (String model, Integer year) {this.model = model; dette.år = år; } offentlig bil () {} @Id @GeneratedValue (strategi = GenerationType.IDENTITY) @Column (navn = "ID", unik = sand, nullabel = falsk, skala = 0) offentlig lang getId () {return id; } @Column (name = "MODEL") offentlig String getModel () {returmodel; } @Column (name = "YEAR") public Integer getYear () {returår; } // standard settermetoder}

3.2. Adgang til databasen

Nu, med alt defineret og på plads, lad os skrive et par tests, der faktisk bruger JPA til at udføre proceduren.

Vi vil hente alle Biler i en given år:

offentlig klasse StoredProcedureTest {privat statisk EntityManagerFactory fabrik = null; privat statisk EntityManager entityManager = null; @BeforeClass offentlig statisk ugyldig init () {fabrik = Persistence.createEntityManagerFactory ("jpa-db"); entityManager = factory.createEntityManager (); } @Test offentlig ugyldig findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery storedProcedure = findByYearProcedure.setParameter ("p_year", 2015); storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (nyt heltal (2015), ((Car) c) .getYear ())); } @Test offentlig ugyldig findCarsByYearNoNamedStored () {StoredProcedureQuery storedProcedure = entityManager .createStoredProcedureQuery ("FIND_CAR_BY_YEAR", Car.class) .registerStoredProcedureParameter (1, Interger.Parameter. storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (nyt heltal (2015), ((Car) c) .getYear ())); }} 

Bemærk, at i den anden test, vi bruger ikke længere den lagrede procedure, vi definerede på enheden. I stedet definerer vi proceduren fra bunden.

Det kan være meget nyttigt, når du har brug for lagrede procedurer, men du har ikke mulighed for at ændre dine enheder og kompilere dem igen.

4. Konklusion

I denne vejledning diskuterede vi brug af lagret procedure med Java Persistence API.

Eksemplet brugt i denne artikel er tilgængeligt som et eksempelprojekt i GitHub.


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