Sprievodca uloženými postupmi v JPA

1. Úvod

V tomto rýchlom výučbe preskúmame použitie uložených procedúr v rozhraní Java Persistence API (JPA).

2. Nastavenie projektu

2.1. Nastavenie Maven

Najprv musíme definovať nasledujúce závislosti v našom pom.xml:

  • javax.javaee-api - pretože obsahuje API JPA
  • implementácia JPA API - v tomto príklade použijeme Hibernácia, ale EclipseLink by bola tiež v poriadku alternatíva
  • a MySQL Databáza
 7.0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} poskytnuté org.hibernate hibernate-core $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. Definícia jednotky perzistencie

Druhým krokom je vytvorenie src / main / resources / META-INF / persistence.xml súbor - ktorý obsahuje definície jednotiek perzistencie:

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

Všetky definované vlastnosti režimu dlhodobého spánku nie sú potrebné, ak odkazujete na zdroj JNDI DataSource (prostredia JEE):

java: jboss / datasources / JpaStoredProcedure

2.3. Skript na vytvorenie tabuľky

Vytvorme teraz Stôl (CAR) - s tromi atribútmi: ID, MODEL a ROK:

CREATE TABLE `car` (` ID` int (10) NOT NULL AUTO_INCREMENT, `MODEL` varchar (50) NOT NULL,` YEAR` int (4) NOT NULL, PRIMARY KEY (`ID`)) ENGINE = InnoDB AUTO_INCREMENT = 2 VÝCHOZÍ CHARSET = utf8;

Predpokladom samozrejme bolo, že schéma DB a povolenia sú už na mieste.

2.4. Vytvorenie uloženej procedúry v databáze DB

Posledným krokom pred prechodom na kód Java je vytvorenie uloženej procedúry v našej databáze MySQL:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` POSTUP `FIND_CAR_BY_YEAR` (v p_roku int) začať VYBERTE ID, MODEL, ROK Z AUTA KDE ROK = p_rok; koniec $$ DELIMITER;

3. Uložená procedúra JPA

Teraz sme pripravení používať JPA na komunikáciu s databázou a vykonávanie uloženej procedúry, ktorú sme definovali.

Keď to urobíme, budeme tiež môcť iterovať výsledky ako Zoznam z Auto.

3.1. The Auto Subjekt

Pod Auto subjekt, ktorý sa dá dobre priradiť k AUTO správca entít databázovú tabuľku.

Všimnite si, že definujeme našu uloženú procedúru priamo v entite pomocou @NamedStoredProcedureQueries anotácia:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parametre = {@StoredProcedureParameter (name = "=" type = Integer.class, mode = ParameterMode.IN)})}) public class Car {private long id; súkromný reťazcový model; súkromné ​​celé číslo rok; verejné auto (reťazcový model, celočíselný rok) {this.model = model; this.year = year; } public Car () {} @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name = "ID", unique = true, nullable = false, scale = 0) public long getId () {return id; } @Column (name = "MODEL") public String getModel () {návratový model; } @Column (name = "YEAR") public Integer getYear () {rok návratu; } // štandardné nastavovacie metódy}

3.2. Prístup do databázy

Teraz, keď je všetko definované a na mieste, napíšme niekoľko testov, ktoré skutočne používajú procedúru pomocou protokolu JPA.

Ideme všetky získať Autá v danom rok:

verejná trieda StoredProcedureTest {private static EntityManagerFactory factory = null; private static EntityManager entityManager = null; @BeforeClass public static void init () {factory = Persistence.createEntityManagerFactory ("jpa-db"); entityManager = factory.createEntityManager (); } @Test public void findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery storedProcedure = findByYearProcedure.setParameter ("p_year", 2015); storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (nové celé číslo (2015), ((auto) c) .getYear ())); } @Test public void findCarsByYearNoNamedStored () {StoredProcedureQuery storedProcedure = entityManager .createStoredProcedureQuery ("FIND_CAR_BY_YEAR", Car.class) .registerStoredProcedureParameter (1, Integer.class, 1 storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (nové celé číslo (2015), ((auto) c) .getYear ())); }} 

Všimnite si, že v druhom teste už nepoužívame uloženú procedúru, ktorú sme definovali pre entitu. Namiesto toho definujeme postup od nuly.

To môže byť veľmi užitočné, keď potrebujete použiť uložené procedúry, ale nemáte možnosť svoje entity upravovať a prekompilovať ich.

4. Záver

V tomto tutoriáli sme diskutovali o použití uloženej procedúry s Java Persistence API.

Príklad použitý v tomto článku je k dispozícii ako vzorový projekt v GitHub.


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