Call Stored Procedure using Hibernate + Jakarta
February 06, 2023
On this page, we will learn to call stored procedure using Hibernate and Jakarta. Oracle transferred Java EE fully to Eclipse Foundation that is an open source foundation. Later Java Persistence API (JPA) was renamed to Jakarta Persistence API (JPA).
Using Jakarta Persistence API, we have following changes in Hibernate.
1. The
EntityManagerFactory
is the Jakarta Persistence equivalent of a SessionFactory
.
2. In Jakarta Persistence nomenclature, the
Session
is represented by an EntityManager
.
3. The
EntityTransaction
is the Jakarta Persistence equivalent of a Transaction
.
Example: Call Stored Procedure
1. Technologies Used1. Java 19
2. Hibernate 6
3. Jakarta Persistence API 3
4. MySQL 5.5
2. MySQL Database
CREATE TABLE `articles` ( `article_id` INT(5) NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `category` VARCHAR(100) NOT NULL, PRIMARY KEY (`article_id`) ) CREATE PROCEDURE read_article ( IN in_id INTEGER, OUT out_title VARCHAR(100), OUT out_category VARCHAR(100) ) BEGIN SELECT title, category INTO out_title, out_category FROM articles WHERE article_id = in_id; END;
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.6.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>6.0.0.Alpha7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> </dependencies>
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" version="3.0"> <persistence-unit name="com.concretepage"> <description>Procedure Demo</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" /> <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost/concretepage" /> <property name="jakarta.persistence.jdbc.user" value="root" /> <property name="jakarta.persistence.jdbc.password" value="cp" /> </properties> </persistence-unit> </persistence>
HibernateUtil.java
package com.concretepage.util; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; public class HibernateUtil { private static final EntityManagerFactory emFactory; static { emFactory = Persistence.createEntityManagerFactory("com.concretepage"); } public static EntityManager getEntityManager(){ return emFactory.createEntityManager(); } }
package com.concretepage; import com.concretepage.util.HibernateUtil; import jakarta.persistence.EntityManager; import jakarta.persistence.ParameterMode; import jakarta.persistence.StoredProcedureQuery; public class RunProcedure { public static void main(String[] args) { EntityManager entityManager = HibernateUtil.getEntityManager(); StoredProcedureQuery query = entityManager.createStoredProcedureQuery("read_article"); query.registerStoredProcedureParameter("in_id", Integer.class, ParameterMode.IN); query.registerStoredProcedureParameter("out_title", String.class, ParameterMode.OUT); query.registerStoredProcedureParameter("out_category", String.class, ParameterMode.OUT); query.setParameter("in_id", 1); query.execute(); String title = (String) query.getOutputParameterValue("out_title"); String cat = (String) query.getOutputParameterValue("out_category"); System.out.println(title); System.out.println(cat); } }
package com.concretepage.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity() @Table(name="articles") public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="article_id") private int articleId; @Column(name="title") private String title; @Column(name="category") private String category; public int getArticleId() { return articleId; } public void setArticleId(int articleId) { this.articleId = articleId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }