banner



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.

Hibernate DataSource, hibernate jndi, hibernate datasource configuration, tomcat hibernate

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.

hibernate datasource, hibernate jndi, tomcat jndi, jndi datasource

hibernate, hibernate datasource, jndi datasource, tomcat jndi datasource

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

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel