Een gids voor opgeslagen procedures met PPV

1. Inleiding

In deze korte tutorial onderzoeken we het gebruik van opgeslagen procedures binnen de Java Persistence API (JPA).

2. Projectconfiguratie

2.1. Maven instellen

We moeten eerst de volgende afhankelijkheden definiëren in onze pom.xml:

  • javax.javaee-api - omdat het de JPA API bevat
  • een JPA API-implementatie - in dit voorbeeld zullen we gebruiken Slaapstand, maar EclipseLink zou ook een OK alternatief zijn
  • een MySQL Database
 7.0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} verstrekt org.hibernate hibernate-core $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. Definitie van persistentie-eenheid

De tweede stap is het creëren van src / main / resources / META-INF / persistence.xml bestand - dat de definities van de persistentie-eenheden bevat:

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

Alle gedefinieerde Hibernate-eigenschappen zijn niet nodig als u verwijst naar een JNDI DataSource (JEE-omgevingen):

java: jboss / datasources / JpaStoredProcedure

2.3. Script voor het maken van tabellen

Laten we nu een Tafel (CAR) - met drie attributen: ID, MODEL en JAAR:

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 STANDAARD CHARSET = utf8;

De aanname was natuurlijk dat het DB-schema en de machtigingen al aanwezig zijn.

2.4. Opgeslagen procedure maken op DB

De allerlaatste stap voordat u naar de Java-code springt, is het maken van de opgeslagen procedure in onze MySQL-database:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` PROCEDURE `FIND_CAR_BY_YEAR` (in p_year int) begin SELECT ID, MODEL, YEAR FROM CAR WHERE YEAR = p_year; einde $$ DELIMITER;

3. De door de PPV opgeslagen procedure

We zijn nu klaar om JPA te gebruiken om met de database te communiceren en de door ons gedefinieerde opgeslagen procedure uit te voeren.

Zodra we dat hebben gedaan, kunnen we de resultaten ook herhalen als een Lijst van Auto.

3.1. De Auto Entiteit

Onder de Auto entiteit die goed worden toegewezen aan de AUTO databasetabel door de Entity Manager.

Merk op dat we onze opgeslagen procedure ook rechtstreeks op de entiteit definiëren met behulp van de @NamedStoredProcedureQueries annotatie:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parameters = {@StoredProcedureParameter (name = "p_yEAR) type = Integer.class, mode = ParameterMode.IN)})}) public class Auto {privé lange id; privé String-model; privé geheel getal jaar; openbare auto (stringmodel, geheel getal jaar) {this.model = model; this.year = jaar; } public Car () {} @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Column (name = "ID", uniek = waar, nullable = false, scale = 0) openbaar lang getId () {retour-id; } @Column (name = "MODEL") public String getModel () {retourmodel; } @Column (name = "YEAR") openbaar geheel getal getYear () {retourjaar; } // standaard setter methoden}

3.2. Toegang tot de database

Nu alles is gedefinieerd en op zijn plaats is, gaan we een paar tests schrijven die daadwerkelijk JPA gebruiken om de procedure uit te voeren.

We gaan alles ophalen Auto's in een gegeven jaar:

openbare klasse StoredProcedureTest {privé statisch EntityManagerFactory factory = null; privé statische EntityManager entityManager = null; @BeforeClass public static void init () {factory = Persistence.createEntityManagerFactory ("jpa-db"); entityManager = factory.createEntityManager (); } @Test openbare void findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery opgeslagenProcedure = findByYearProcedure.setParameter ("p_year", 2015); opgeslagenProcedure.getResultList () .forEach (c -> Assert.assertEquals (nieuw geheel getal (2015), ((Auto) c) .getYear ())); } @Test openbare void findCarsByYearNoNamedStored () {StoredProcedureQuery opgeslagenProcedure = entityManager .createStoredProcedureQuery ("FIND_CAR_BY_YEAR", Car.class) .registerStoredProcedureParameter (1, Integer.class, ParameterParamIN). opgeslagenProcedure.getResultList () .forEach (c -> Assert.assertEquals (nieuw geheel getal (2015), ((Auto) c) .getYear ())); }} 

Merk op dat in de tweede test, we gebruiken niet langer de opgeslagen procedure die we voor de entiteit hebben gedefinieerd. In plaats daarvan definiëren we de procedure helemaal opnieuw.

Dat kan erg handig zijn als u opgeslagen procedures moet gebruiken, maar u niet de mogelijkheid heeft om uw entiteiten te wijzigen en ze opnieuw te compileren.

4. Conclusie

In deze tutorial bespraken we het gebruik van Stored Procedure met de Java Persistence API.

Het voorbeeld dat in dit artikel wordt gebruikt, is beschikbaar als voorbeeldproject in GitHub.