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.