En guide til lagrede prosedyrer med JPA

1. Introduksjon

I denne raske opplæringen vil vi utforske bruken av lagrede prosedyrer i Java Persistence API (JPA).

2. Prosjektoppsett

2.1. Maven Setup

Vi må først definere følgende avhengigheter i vår pom.xml:

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

2.2. Definisjon av utholdenhetsenhet

Det andre trinnet er etableringen av src / main / resources / META-INF / persistence.xml fil - som inneholder definisjonene av utholdenhetsenheter:

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

Alle definerte dvalemodusegenskaper er ikke nødvendig hvis du refererer til en JNDI DataSource (JEE-miljøer):

java: jboss / datakilder / JpaStoredProcedure

2.3. Tabellopprettingsskript

La oss nå lage en Tabell (CAR) - med tre attributter: ID, MODELL og ÅR:

OPPRETT BORD `bil` (` ID` int (10) IKKE NULL AUTO_INCREMENT, `MODELL` varchar (50) IKKE NULL,` YEAR` int (4) IKKE NULL, PRIMÆR NØKKEL (`ID`)) MOTOR = InnoDB AUTO_INCREMENT = 2 STANDARD CHARSET = utf8;

Antagelsen var selvfølgelig at DB-skjemaet og tillatelsene allerede er på plass.

2.4. Lagret prosedyreoppretting på DB

Det aller siste trinnet før du hopper til Java-koden er lagring av prosedyren i MySQL-databasen:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` PROSEDYRE `FIND_CAR_BY_YEAR` (i p_year int) begynn VELG ID, MODELL, ÅR FRA BIL HVOR ÅR = p_year; slutt $$ DELIMITER;

3. JPAs lagrede prosedyre

Vi er nå klare til å bruke JPA til å kommunisere med databasen og utføre den lagrede prosedyren vi definerte.

Når vi har gjort det, vil vi også kunne gjenta resultatene som en Liste av Bil.

3.1. De Bil Enhet

Under Bil enhet som godt kan kartlegges til BIL databasetabell av Entity Manager.

Legg merke til at vi også definerer vår lagrede prosedyre direkte på enheten ved å bruke @NamedStoredProcedureQueries kommentar:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parametere = {@StoredProcedureProcedure = type = Integer.class, mode = ParameterMode.IN)})}) offentlig klasse Bil {privat lang id; privat streng modell; privat helår; public Car (String model, Integer year) {this.model = model; dette.år = år; } public Car () {} @Id @GeneratedValue (strategi = GenerationType.IDENTITY) @Column (name = "ID", unik = true, nullable = false, scale = 0) public long getId () {return id; } @Column (name = "MODEL") offentlig String getModel () {returmodell; } @Column (name = "YEAR") offentlig Heltall getYear () {returår; } // standard settermetoder}

3.2. Tilgang til databasen

Nå, med alt definert og på plass, la oss skrive et par tester som faktisk bruker JPA for å utføre prosedyren.

Vi skal hente ut alt Biler i en gitt år:

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

Legg merke til at i den andre testen, vi bruker ikke lenger den lagrede prosedyren vi definerte på enheten. I stedet definerer vi prosedyren fra bunnen av.

Det kan være veldig nyttig når du trenger å bruke lagrede prosedyrer, men du har ikke muligheten til å endre enhetene dine og kompilere dem på nytt.

4. Konklusjon

I denne opplæringen diskuterte vi å bruke Stored Procedure med Java Persistence API.

Eksemplet som brukes i denne artikkelen er tilgjengelig som et eksempelprosjekt i GitHub.


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