How Do I Register A Hibernate Session Factory Jndi Tomcat
Welcome to the Hibernate Tomcat JNDI DataSource example tutorial. We have already seen how to use Hibernate ORM tool in standalone coffee application, today we volition learn how to utilise Hibernate with DataSource in Tomcat servlet container.
Using hibernate in web application is very easy, all we need is to configure DataSource
backdrop in hibernate configuration file. First of all we need to setup test database and JNDI DataSource in tomcat container.
Hibernate DataSource JNDI Case Database Setup
I am using MySQL for my example, below script is executed to create a simple tabular array and insert some values into it.
employee.sql
CREATE Tabular array `Employee` ( `id` int(11) unsigned Not NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `function` varchar(20) DEFAULT NULL, `insert_time` datetime DEFAULT Null, Principal KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8; INSERT INTO `Employee` (`id`, `name`, `part`, `insert_time`) VALUES (iii, 'Pankaj', 'CEO', now()); INSERT INTO `Employee` (`id`, `proper noun`, `role`, `insert_time`) VALUES (14, 'David', 'Developer', now());
The Database schema name is TestDB.
Tomcat JNDI DataSource Configuration
For configuring tomcat container to initialize DataSource, nosotros need to make some changes in tomcat server.xml and context.xml files.
server.xml
<Resource proper noun="jdbc/MyLocalDB" global="jdbc/MyLocalDB" auth="Container" blazon="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TestDB" username="pankaj" password="pankaj123" maxActive="100" maxIdle="xx" minIdle="5" maxWait="10000"/>
Add above resource in the server.xml GlobalNamingResources
element.
context.xml
<ResourceLink name="jdbc/MyLocalDB" global="jdbc/MyLocalDB" auth="Container" type="javax.sql.DataSource" />
Add in a higher place ResourceLink
in the context.xml file, information technology's required so that applications can access the JNDI resources with name jdbc/MyLocalDB
.
Only restart the server, you should not see any errors in the tomcat server logs. If at that place are whatsoever wrong configurations, such as password is wrong, you will get the corresponding exception in the server log.
You likewise demand to make sure that MySQL driver jar file is within the tomcat lib directory, otherwise tomcat will not exist able to create database connectedness and you will get ClassNotFoundException
in logs.
At present our database and tomcat server JNDI setup is set up, let's movement to create our web application using hide.
Hibernate DataSource Case Dynamic Web Project
Create a dynamic spider web project in Eclipse so configure it as Maven projection. Our terminal project structure volition wait like below paradigm.
Note that I am using Tomcat-7 for my project deployment and I have added information technology to the build path, so that we don't need to separately add Servlet API dependencies in our project.
Tomcat-vii supports Servlet 3 specs and nosotros will exist using annotations to create our servlets. If yous are non familiar with Servlet 3 annotations, you should check out Servlet Tutorial for Beginners.
Permit's look into each of the components one past one.
Hibernate Maven Dependencies
Our concluding pom.xml file looks like below.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>HibernateDataSource</groupId> <artifactId>HibernateDataSource</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.hide</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.5.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.5</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.three</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> <finalName>${project.artifactId}</finalName> </build> </project>
I am using Hibernate latest version four.iii.5.Final, hibernate-core
dependency is added for Hibernate. mysql-connector-java
dependency is added because we are using MySQL database, although scope is provided because it's already part of the tomcat container libraries.
Even if we don't add MySQL driver dependencies, our project volition compile and run fine. However it's better to include it so that if someone will look into the projection dependencies, it will be articulate that we are using MySQL database.
Hide DataSource Configuration
Our hibernate configuration file with datasource looks like below.
hibernate.cfg.xml
<?xml version="i.0" encoding="UTF-8"?> <!DOCTYPE hide-configuration PUBLIC "-//Hibernate/Hide Configuration DTD three.0//EN" "https://hide.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <holding proper name="hibernate.connexion.driver_class">com.mysql.jdbc.Driver</belongings> <property name="hide.dialect">org.hibernate.dialect.MySQLDialect</property> <belongings proper name="hibernate.connection.datasource">java:comp/env/jdbc/MyLocalDB</property> <property name="hide.current_session_context_class">thread</property> <!-- Mapping with model course containing annotations --> <mapping class="com.journaldev.servlet.hide.model.Employee"/> </session-mill> </hibernate-configuration>
hibernate.connexion.datasource
property is used to provide the DataSource name that will be used by Hide for database operations.
Hibernate DataSource Example Model Class
As you tin can see in hide configuration file, we are using annotations in our model class Employee. Our model bean looks similar below.
Employee.java
package com.journaldev.servlet.hibernate.model; import java.util.Appointment; import javax.persistence.Cavalcade; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Tabular array; import javax.persistence.UniqueConstraint; @Entity @Table(name="Employee", uniqueConstraints={@UniqueConstraint(columnNames={"ID"})}) public form Employee { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="ID", nullable=fake, unique=true, length=11) private int id; @Cavalcade(proper name="NAME", length=20, nullable=truthful) individual String proper name; @Column(name="ROLE", length=20, nullable=true) private String function; @Cavalcade(name="insert_time", nullable=truthful) private Appointment insertTime; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { render name; } public void setName(String name) { this.proper noun = proper name; } public Cord getRole() { return role; } public void setRole(String role) { this.office = role; } public Engagement getInsertTime() { render insertTime; } public void setInsertTime(Engagement insertTime) { this.insertTime = insertTime; } }
Model bean is same equally we used in Hibernate Beginners Tutorial, you should check it out if you have any confusion related to any of the annotations used.
Hibernate DataSource Tomcat JNDI Servlet Listener
Since nosotros have to initialize Hibernate SessionFactory
because nosotros can use it in the application and besides when spider web application is destroyed, nosotros need to destroy SessionFactory. So the all-time place to do this in a ServletContextListener
implementation.
HibernateSessionFactoryListener.java
package com.journaldev.servlet.hibernate.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.note.WebListener; import org.hibernate.SessionFactory; import org.hibernate.kicking.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.jboss.logging.Logger; @WebListener public course HibernateSessionFactoryListener implements ServletContextListener { public terminal Logger logger = Logger.getLogger(HibernateSessionFactoryListener.class); public void contextDestroyed(ServletContextEvent servletContextEvent) { SessionFactory sessionFactory = (SessionFactory) servletContextEvent.getServletContext().getAttribute("SessionFactory"); if(sessionFactory != zero && !sessionFactory.isClosed()){ logger.info("Closing sessionFactory"); sessionFactory.close(); } logger.info("Released Hibernate sessionFactory resource"); } public void contextInitialized(ServletContextEvent servletContextEvent) { Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); logger.info("Hibernate Configuration created successfully"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); logger.info("ServiceRegistry created successfully"); SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); logger.info("SessionFactory created successfully"); servletContextEvent.getServletContext().setAttribute("SessionFactory", sessionFactory); logger.info("Hide SessionFactory Configured successfully"); } }
If y'all are non familiar with servlet listeners, please read Servlet Listener Tutorial.
Hibernate Tomcat JNDI Case Servlet Implementation
Permit'southward write a elementary servlet where we will pass employee id every bit asking parameter and information technology volition print out the employee information from database, obviously we volition use Hibernate to query the database and become employee information.
GetEmployeeByID.java
package com.journaldev.servlet.hibernate; import java.io.IOException; import coffee.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.jboss.logging.Logger; import com.journaldev.servlet.hide.model.Employee; @WebServlet("/GetEmployeeByID") public course GetEmployeeByID extends HttpServlet { private static final long serialVersionUID = 1L; public last Logger logger = Logger.getLogger(GetEmployeeByID.class); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int empId = Integer.parseInt(asking.getParameter("empId")); logger.info("Asking Param empId="+empId); SessionFactory sessionFactory = (SessionFactory) asking.getServletContext().getAttribute("SessionFactory"); Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); Employee emp = (Employee) session.get(Employee.form, empId); tx.commit(); PrintWriter out = response.getWriter(); response.setContentType("text/html"); if(emp != zilch){ out.print("<html><body><h2>Employee Details</h2>"); out.print("<table border=\"1\" cellspacing=10 cellpadding=5>"); out.print("<th>Employee ID</th>"); out.impress("<th>Employee Proper name</th>"); out.print("<th>Employee Function</thursday>"); out.print("<tr>"); out.print("<td>" + empId + "</td>"); out.print("<td>" + emp.getName() + "</td>"); out.print("<td>" + emp.getRole() + "</td>"); out.print("</tr>"); out.impress("</table></trunk><br/>"); out.impress("</html>"); }else{ out.print("<html><body><h2>No Employee Institute with ID="+empId+"</h2></body></html>"); } } }
Information technology's a very simple servlet grade, I am using @WebServlet
note to provide the URI pattern for information technology.
Testing Hide DataSource Tomcat JNDI Example Application
Our application is ready at present, just consign as war file and deploy it in the tomcat container. Below are some of the screenshots when we invoke our application servlet.
Observe that I am passing empId request parameter in the request URL query string. Yous will as well see our application generated logs in the server logs.
May 08, 2014 8:14:16 PM org.hibernate.cfg.Configuration configure INFO: HHH000043: Configuring from resource: hibernate.cfg.xml May 08, 2014 8:xiv:16 PM org.hide.cfg.Configuration getConfigurationInputStream INFO: HHH000040: Configuration resource: hibernate.cfg.xml May 08, 2014 eight:14:16 PM org.hibernate.cfg.Configuration doConfigure INFO: HHH000041: Configured SessionFactory: zippo May 08, 2014 8:14:16 PM com.journaldev.servlet.hibernate.listener.HibernateSessionFactoryListener contextInitialized INFO: Hibernate Configuration created successfully May 08, 2014 viii:14:16 PM com.journaldev.servlet.hibernate.listener.HibernateSessionFactoryListener contextInitialized INFO: ServiceRegistry created successfully May 08, 2014 viii:14:16 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect May 08, 2014 eight:14:17 PM org.hide.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 May 08, 2014 8:14:17 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) May 08, 2014 viii:14:17 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory May 08, 2014 8:14:17 PM com.journaldev.servlet.hide.listener.HibernateSessionFactoryListener contextInitialized INFO: SessionFactory created successfully May 08, 2014 8:14:17 PM com.journaldev.servlet.hibernate.listener.HibernateSessionFactoryListener contextInitialized INFO: Hide SessionFactory Configured successfully May 08, 2014 viii:14:32 PM com.journaldev.servlet.hibernate.GetEmployeeByID doGet INFO: Request Param empId=3 May 08, 2014 viii:xv:22 PM com.journaldev.servlet.hibernate.GetEmployeeByID doGet INFO: Request Param empId=3
If you volition undeploy the application or end the server, yous will see server logs for destroying the SessionFactory.
May 08, 2014 xi:31:sixteen PM com.journaldev.servlet.hibernate.listener.HibernateSessionFactoryListener contextDestroyed INFO: Endmost sessionFactory May 08, 2014 eleven:31:16 PM com.journaldev.servlet.hibernate.listener.HibernateSessionFactoryListener contextDestroyed INFO: Released Hibernate sessionFactory resource
That'due south all for Hibernate DataSource instance for tomcat container, I promise information technology's easy to sympathize and implement. Download the sample projection from below link and play around with information technology to learn more.
How Do I Register A Hibernate Session Factory Jndi Tomcat,
Source: https://www.journaldev.com/2905/hibernate-tomcat-jndi-datasource-example-tutorial
Posted by: edwardssaffecre.blogspot.com
0 Response to "How Do I Register A Hibernate Session Factory Jndi Tomcat"
Post a Comment