Vodič za pohranjene postupke s JPA

1. Uvod

U ovom brzom vodiču istražit ćemo upotrebu pohranjenih procedura unutar Java Persistent API-ja (JPA).

2. Postavljanje projekta

2.1. Postavljanje Mavena

Prvo moramo definirati sljedeće ovisnosti u našem pom.xml:

  • javax.javaee-api - jer uključuje JPA API
  • implementacija JPA API-ja - u ovom ćemo primjeru koristiti Hibernate, ali EclipseLink bi također bila u redu alternativa
  • a MySQL Baza podataka
 7.0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} pod uvjetom da org.hibernate hibernate-core $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. Definicija jedinice postojanosti

Drugi korak je stvaranje src / main / resources / META-INF / persistence.xml datoteka - koja sadrži definicije jedinice trajnosti:

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

Sva definirana svojstva hibernacije nisu potrebna ako se pozivate na JNDI DataSource (JEE okoline):

java: jboss / datasources / JpaStoredProcedure

2.3. Skripta za stvaranje tablice

Stvorimo sada Tablica (CAR) - s tri atributa: ID, MODEL i GODINA:

STVORI TABLU `car` (` ID` int (10) NOT NULL AUTO_INCREMENT, `MODEL` varchar (50) NOT NULL,` YEAR` int (4) NOT NULL, PRIMARY KEY (`ID`)) MOTOR = InnoDB AUTO_INCREMENT = 2 DETALJNA KARTICA = utf8;

Pretpostavka je bila, naravno, da su DB shema i dozvole već na mjestu.

2.4. Stvaranje pohranjene procedure na DB-u

Posljednji korak prije prijelaza na java kôd je stvaranje pohranjene procedure u našoj MySQL bazi podataka:

DELIMITER $$ STVORI DEFINER = `root` @` localhost` POSTUPAK `FIND_CAR_BY_YEAR` (u p_year int) begin SELECT ID, MODEL, GODINA IZ AUTA GDJE GODINA = p_year; kraj $$ DELIMITER;

3. Pohranjeni postupak JPA

Sada smo spremni koristiti JPA za komunikaciju s bazom podataka i izvršavanje pohranjene procedure koju smo definirali.

Jednom kad to učinimo, moći ćemo i ponoviti rezultate kao a Popis od Automobil.

3.1. The Automobil Entitet

Ispod Automobil entitet koji se dobro preslikava na AUTOMOBIL tablicu baze podataka od strane Entity Manager-a.

Primijetite da također definiramo svoj pohranjeni postupak izravno na entitetu pomoću @NamedStoredProcedureQueries napomena:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parametri = {@StoredPearryear (Parameter = {@StoredPearPearPearPear ( type = Integer.class, mode = ParameterMode.IN)})}) javna klasa Car {private long id; model privatnog niza; privatna cijela godina; javni automobil (model niza, cijela godina) {this.model = model; this.year = godina; } javni automobil () {} @Id @GeneratedValue (strategija = GenerationType.IDENTITY) @Column (name = "ID", unique = true, nullable = false, scale = 0) public long getId () {return id; } @Column (name = "MODEL") javni niz getModel () {return model; } @Column (name = "YEAR") public Integer getYear () {return year; } // // standardne metode postavljanja}

3.2. Pristup bazi podataka

Sad, sa svime definiranim i na svom mjestu, napišimo nekoliko testova koji zapravo koriste JPA za izvršavanje postupka.

Pokupit ćemo sve Automobili u danoj godina:

javna klasa StoredProcedureTest {private static EntityManagerFactory factory = null; privatni statički EntityManager entityManager = null; @BeforeClass javna statička void init () {factory = Persistence.createEntityManagerFactory ("jpa-db"); entityManager = factory.createEntityManager (); } @Test javna praznina findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery storedProcedure = findByYearProcedure.setParameter ("p_year", 2015); storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (novi Integer (2015), ((Car) c) .getYear ())); } Public void @Test findCarsByYearNoNamedStored () {StoredProcedureQuery storedProcedure = entityManager .createStoredProcedureQuery ( "FIND_CAR_BY_YEAR" Car.class) .registerStoredProcedureParameter (1, Integer.class, ParameterMode.IN) .setParameter (1, 2015); storedProcedure.getResultList () .forEach (c -> Assert.assertEquals (novi Integer (2015), ((Car) c) .getYear ())); }} 

Primijetite da u drugom testu, više ne koristimo pohranjenu proceduru koju smo definirali na entitetu. Umjesto toga, postupak definiramo ispočetka.

To može biti vrlo korisno kada trebate koristiti pohranjene procedure, ali nemate mogućnost modificiranja svojih entiteta i njihove ponovne kompilacije.

4. Zaključak

U ovom smo tutorijalu razgovarali o korištenju pohranjenih postupaka s Java Persistent API-jem.

Primjer korišten u ovom članku dostupan je kao ogledni projekt u GitHubu.


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