How To Create Java Based Hibernate Configurations

Java Based Configuration

In this tutorial I will discuss how to create Java based Hibernate configurations. In Java based configuration you don’t need to create any XML or properties file for putting Hibernate configuration. The configuration for connection to database and creating SessionFactory instance is written in to a Java file.

I will put Hibernate configuration as well SessionFactory using Java based configuration. To make it clear I will create both XML and Java based configuration so that it would be easy to understand.

Prerequisites

Hibernate 5.4.11/6.3.1, Java 8/19

For Hibernate 6.3.1, I have used Java 19.

Hibernate Configurations

Let’s say we have the below hibernate configurations in XML file (hibernate.cfg.xml).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="connection.url">jdbc:mysql://localhost:3306/roytuts</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.current_session_context_class">thread</property>
		<property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<mapping class="com.roytuts.hibernate.domain.model.Item" />
	</session-factory>
</hibernate-configuration>

The equivalent configurations in Java will be as shown below:

Properties settings = new Properties();

settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
settings.put(Environment.URL, "jdbc:mysql://localhost:3306/roytuts");
settings.put(Environment.USER, "root");
settings.put(Environment.PASS, "root");
settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
settings.put(Environment.SHOW_SQL, "true");
settings.put(Environment.FORMAT_SQL, "true");
settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
settings.put(Environment.HBM2DDL_AUTO, "update"); // or create
settings.put(Environment.QUERY_TRANSLATOR, "org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory");

Configuration configuration = new Configuration();

configuration.setProperties(settings);
configuration.addAnnotatedClass(Item.class);

There are more available properties in Hibernate and you can use them if you need.

In Hibernate 6.3.1, there are some environment variables have been deprecated and you need to change the above configuration as shown below:

Properties settings = new Properties();

settings.put(JdbcSettings.JAKARTA_JDBC_DRIVER, "com.mysql.cj.jdbc.Driver");
settings.put(JdbcSettings.JAKARTA_JDBC_URL, "jdbc:mysql://localhost:3306/roytuts");
settings.put(JdbcSettings.JAKARTA_JDBC_USER, "root");
settings.put(JdbcSettings.JAKARTA_JDBC_PASSWORD, "root");
settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
settings.put(Environment.SHOW_SQL, "true");
settings.put(Environment.FORMAT_SQL, "true");
settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
settings.put(Environment.HBM2DDL_AUTO, "update"); // or create
settings.put(Environment.SEMANTIC_QUERY_TRANSLATOR, "org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory");

Configuration configuration = new Configuration();

configuration.setProperties(settings);
configuration.addAnnotatedClass(Item.class);

The Item class is not available in this example but you can use your own class.

Build SessionFactory

Now we will build the SessionFactory from the above configurations.

try {
	Configuration configuration = configuration();
	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
			.applySettings(configuration.getProperties()).build();

	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Exception e) {
	e.printStackTrace();
}

The complete source code for Java based hibernate configurations and building SessionFactory is given below:

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;

import com.roytuts.hibernate.criteria.api.entity.Item;

public class HibernateConfig {

	private static SessionFactory sessionFactory;

	public static SessionFactory getSessionFactory() {

		if (sessionFactory == null) {
			try {
				Configuration configuration = configuration();
				ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
						.applySettings(configuration.getProperties()).build();

				sessionFactory = configuration.buildSessionFactory(serviceRegistry);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return sessionFactory;
	}

	private static Configuration configuration() {
		Properties settings = new Properties();

		settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
		settings.put(Environment.URL, "jdbc:mysql://localhost:3306/roytuts");
		settings.put(Environment.USER, "root");
		settings.put(Environment.PASS, "root");
		settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
		settings.put(Environment.SHOW_SQL, "true");
		settings.put(Environment.FORMAT_SQL, "true");
		settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
		settings.put(Environment.HBM2DDL_AUTO, "update"); // or create
		settings.put(Environment.QUERY_TRANSLATOR, "org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory");

		Configuration configuration = new Configuration();

		configuration.setProperties(settings);
		configuration.addAnnotatedClass(Item.class);

		return configuration;
	}

}

For Hibernate 6.3.1, you can use the following class for Hibernate configuration:

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.JdbcSettings;
import org.hibernate.service.ServiceRegistry;

import com.roytuts.jsf.hibernate.domain.Cds;

public class HibernateConfig {

	private static SessionFactory sessionFactory;

	public static SessionFactory getSessionFactory() {

		if (sessionFactory == null) {
			try {
				Configuration configuration = configuration();
				ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
						.applySettings(configuration.getProperties()).build();

				sessionFactory = configuration.buildSessionFactory(serviceRegistry);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return sessionFactory;
	}

	private static Configuration configuration() {
		Properties settings = new Properties();

		settings.put(JdbcSettings.JAKARTA_JDBC_DRIVER, "com.mysql.cj.jdbc.Driver");
		settings.put(JdbcSettings.JAKARTA_JDBC_URL, "jdbc:mysql://localhost:3306/roytuts");
		settings.put(JdbcSettings.JAKARTA_JDBC_USER, "root");
		settings.put(JdbcSettings.JAKARTA_JDBC_PASSWORD, "root");
		settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
		settings.put(Environment.SHOW_SQL, "true");
		settings.put(Environment.FORMAT_SQL, "true");
		settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
		settings.put(Environment.HBM2DDL_AUTO, "update"); // or create
		settings.put(Environment.SEMANTIC_QUERY_TRANSLATOR, "org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory");

		Configuration configuration = new Configuration();

		configuration.setProperties(settings);
		configuration.addAnnotatedClass(Cds.class);

		return configuration;
	}

}

Hope you got an idea how to configure for Hibernate framework using Java.

Leave a Reply

Your email address will not be published. Required fields are marked *