Ú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: 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. 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.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 ())); }}
4. Következtetés