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: 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. 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.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 ())); }}
4. Conclusie