Útmutató a JPA-val tárolt eljárásokhoz

1. Bemutatkozás

Ebben a gyors bemutatóban feltárjuk a tárolt eljárások használatát a Java Persistence API-n (JPA) belül.

2. Projekt beállítása

2.1. Maven Setup

Először meg kell határoznunk a következő függőségeket pom.xml:

  • javax.javaee-api - mivel tartalmazza a JPA API-t
  • egy JPA API megvalósítás - ebben a példában fogjuk használni Hibernálás, de EclipseLink egy OK alternatíva is lenne
  • a MySQL Adatbázis
 7.0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} biztosított org.hibernate hibernate-core $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. Perzisztencia egység meghatározása

A második lépés a src / main / resources / META-INF / persistence.xml fájl - amely tartalmazza a perzisztencia egység definícióit:

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

Az összes meghatározott hibernált tulajdonságra nincs szükség, ha JNDI adatforrásra (JEE környezetek) hivatkozik:

java: jboss / datasources / JpaStoredProcedure

2.3. Tábla létrehozási szkript

Most hozzunk létre egy Táblázat (CAR) - három attribútummal: ID, MODEL és ÉV:

CREATE TABLE `autó` (` ID` int (10) NEM NULL AUTO_INCREMENT, `MODEL` varchar (50) NOT NULL,` YEAR` int (4) NOT NULL, PRIMARY KEY (`ID`)) MOTOR = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8;

A feltételezés természetesen az volt, hogy a DB séma és engedélyek már vannak.

2.4. Tárolt eljárás létrehozása a DB-n

A java kódra való ugrás előtti utolsó lépés a MySQL adatbázisunkban tárolt eljárás létrehozása:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` ELJÁRÁS `FIND_CAR_BY_YEAR` (p_year int-ben) kezdődik SELECT ID, MODEL, ÉV FOLYAMATBÓL, HOL ÉV = p_év; vég $$ DELIMITER;

3. A KPK által tárolt eljárás

Most már készen állunk a JPA használatára az adatbázissal való kommunikációhoz és az általunk meghatározott tárolt eljárás végrehajtásához.

Miután ezt megtettük, képesek leszünk iterálni az eredményeket a Lista nak,-nek Autó.

3.1. A Autó Entitás

Valami alatt Autó entitás, amely jól leképezhető a AUTÓ adatbázis-táblázatot az Entity Manager.

Figyelje meg, hogy a tárolt eljárásunkat közvetlenül az entitáson is definiáljuk a @NamedStoredProcedureQueries kommentár:

@Entity @Table (name = "CAR") @NamesStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parametri = {@StoredPetery (Name) " type = Integer.class, mode = ParameterMode.IN)})}) public class Car {private long id; privát húr modell; magán egész év; public Car (Vonós modell, Egész év) {this.model = modell; ez.év = év; } public Car () {} @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name = "ID", egyedi = true, nullable = false, scale = 0) public long getId () {return id; } @Column (name = "MODEL") public String getModel () {return model; } @Column (név = "ÉV") public Integer getYear () {visszatérési év; } // szabványos beállító módszerek}

3.2. Hozzáférés az adatbázishoz

Most, hogy minden meghatározva és a helyén van, írjunk pár tesztet, amelyek valóban a JPA-t használják az eljárás végrehajtásához.

Mindent be fogunk szerezni Autók egy adott év:

public class StoredProcedureTest {private static EntityManagerFactory factory = null; privát statikus EntityManager entitásManager = null; @BeforeClass public static void init () {gyár = Persistence.createEntityManagerFactory ("jpa-db"); entitásManager = gyár.createEntityManager (); } @Test public void findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entitásManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery storageProcedure = findByYearProcedure.setParameter ("p_év", 2015); tároltProcedure.getResultList () .forEach (c -> Assert.assertEquals (új Integer (2015), ((Car) c) .getYear ())); } @Test public void findCarsByYearNoNamedStored () {StoredProcedureQuery tároltProcedure = entitásManager .createStoredProcedureQuery ("FIND_CAR_BY_YEAR", Car.class) .registerStoredProcedureParameter (1. Integer. (1, Integer.). tároltProcedure.getResultList () .forEach (c -> Assert.assertEquals (új Integer (2015), ((Car) c) .getYear ())); }} 

Vegye figyelembe, hogy a második tesztben már nem használjuk azt a tárolt eljárást, amelyet az entitáson definiáltunk. Ehelyett a nulláról határozzuk meg az eljárást.

Ez nagyon hasznos lehet, ha tárolt eljárásokat kell használnia, de nincs lehetősége módosítani az entitásokat és újrafordítani őket.

4. Következtetés

Ebben az oktatóanyagban megvitattuk a Tárolt eljárás használatát a Java Persistence API-val.

A cikkben használt példa mintaprojektként érhető el a GitHub-ban.