Tutorials Logic, IN info@tutorialslogic.com

Hibernate Configuration cfg.xml C3P0 Pooling

What is Hibernate Configuration?

Hibernate configuration is the process of setting up Hibernate ORM framework to connect to a database and manage entity mappings. Configuration defines database connection details, dialect, caching strategies, and other Hibernate-specific settings that control how the framework operates.

Proper configuration is essential for Hibernate to function correctly. It tells Hibernate which database to connect to, how to generate SQL, whether to show SQL queries, and how to handle schema generation. Configuration can be done through XML files (hibernate.cfg.xml), properties files, or programmatically using Java code.

Configuration Methods

Hibernate supports three main configuration approaches:

  • XML Configuration (hibernate.cfg.xml) - Traditional approach using XML file in classpath
  • Properties File (hibernate.properties) - Simple key-value pairs for configuration
  • Programmatic Configuration - Configure using Java code with Configuration API

Key Configuration Properties

Hibernate configuration properties control various aspects of the framework's behavior. Understanding these properties is crucial for optimizing performance and ensuring correct operation.

Property Values Description
hibernate.dialect MySQLDialect, PostgreSQLDialect, Oracle12cDialect Database-specific SQL generation and optimization
hibernate.hbm2ddl.auto validate, update, create, create-drop, none Automatic schema management strategy
hibernate.show_sql true/false Print generated SQL statements to console
hibernate.format_sql true/false Format SQL for better readability
hibernate.use_sql_comments true/false Add comments to SQL for debugging
hibernate.connection.pool_size integer (e.g., 10) Built-in connection pool size (not for production)
hibernate.cache.use_second_level_cache true/false Enable second-level caching
hibernate.jdbc.batch_size integer (e.g., 50) Number of statements to batch together
hibernate.current_session_context_class thread, jta, managed Session context management strategy

hibernate.cfg.xml Configuration

The hibernate.cfg.xml file is the most common configuration method. It should be placed in the src/main/resources directory (Maven) or classpath root. This XML file contains all database connection details, Hibernate properties, and entity mappings.

Complete hibernate.cfg.xml Configuration

Complete hibernate.cfg.xml Configuration
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- ========== Database Connection Settings ========== -->
        <property name="hibernate.connection.driver_class">
            com.mysql.cj.jdbc.Driver
        </property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>

        <!-- ========== Hibernate Dialect ========== -->
        <!-- Tells Hibernate which SQL dialect to use -->
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQL8Dialect
        </property>

        <!-- ========== Schema Management ========== -->
        <!-- validate: validate schema, no changes -->
        <!-- update: update schema if needed -->
        <!-- create: drop and recreate schema -->
        <!-- create-drop: drop schema on SessionFactory close -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- ========== SQL Logging ========== -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.use_sql_comments">true</property>

        <!-- ========== C3P0 Connection Pool ========== -->
        <!-- Recommended for production use -->
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>

        <!-- ========== Performance Optimization ========== -->
        <property name="hibernate.jdbc.batch_size">50</property>
        <property name="hibernate.order_inserts">true</property>
        <property name="hibernate.order_updates">true</property>
        <property name="hibernate.jdbc.batch_versioned_data">true</property>

        <!-- ========== Second Level Cache ========== -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        <property name="hibernate.cache.use_query_cache">true</property>

        <!-- ========== Session Context ========== -->
        <property name="hibernate.current_session_context_class">
            thread
        </property>

        <!-- ========== Entity Mappings ========== -->
        <!-- Register your entity classes here -->
        <mapping class="com.example.entity.User"/>
        <mapping class="com.example.entity.Product"/>
        <mapping class="com.example.entity.Order"/>
        <mapping class="com.example.entity.Customer"/>
    </session-factory>
</hibernate-configuration>

Programmatic Configuration

Programmatic configuration allows you to configure Hibernate using Java code instead of XML. This approach is useful when configuration needs to be dynamic or when you want to avoid XML files. It's also the preferred method in modern Spring Boot applications.

Programmatic Hibernate Configuration

Programmatic Hibernate Configuration
package com.example.util;

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.example.entity.*;
import java.util.Properties;

public class HibernateUtil {

    private static SessionFactory sessionFactory;

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            try {
                Configuration configuration = new Configuration();

                // Hibernate settings equivalent to hibernate.cfg.xml
                Properties settings = new Properties();

                // JDBC settings
                settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
                settings.put(Environment.URL, "jdbc:mysql://localhost:3306/mydb?useSSL=false");
                settings.put(Environment.USER, "root");
                settings.put(Environment.PASS, "password");

                // Hibernate settings
                settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL8Dialect");
                settings.put(Environment.SHOW_SQL, "true");
                settings.put(Environment.FORMAT_SQL, "true");
                settings.put(Environment.HBM2DDL_AUTO, "update");

                // C3P0 connection pool
                settings.put(Environment.C3P0_MIN_SIZE, "5");
                settings.put(Environment.C3P0_MAX_SIZE, "20");
                settings.put(Environment.C3P0_TIMEOUT, "300");
                settings.put(Environment.C3P0_MAX_STATEMENTS, "50");

                // Performance settings
                settings.put(Environment.STATEMENT_BATCH_SIZE, "50");
                settings.put(Environment.ORDER_INSERTS, "true");
                settings.put(Environment.ORDER_UPDATES, "true");

                // Second level cache
                settings.put(Environment.USE_SECOND_LEVEL_CACHE, "true");
                settings.put(Environment.USE_QUERY_CACHE, "true");
                settings.put(Environment.CACHE_REGION_FACTORY,
                    "org.hibernate.cache.ehcache.EhCacheRegionFactory");

                // Session context
                settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");

                configuration.setProperties(settings);

                // Add annotated entity classes
                configuration.addAnnotatedClass(User.class);
                configuration.addAnnotatedClass(Product.class);
                configuration.addAnnotatedClass(Order.class);
                configuration.addAnnotatedClass(Customer.class);

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

                sessionFactory = configuration.buildSessionFactory(serviceRegistry);

                System.out.println("Hibernate SessionFactory created successfully");

            } catch (Exception e) {
                e.printStackTrace();
                throw new ExceptionInInitializerError(e);
            }
        }
        return sessionFactory;
    }

    public static void shutdown() {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }
}

Database Dialects

Hibernate dialects are database-specific implementations that generate optimized SQL for different database systems. Choosing the correct dialect ensures Hibernate generates efficient and compatible SQL queries.

Database Dialect Class
MySQL 8.x org.hibernate.dialect.MySQL8Dialect
MySQL 5.x org.hibernate.dialect.MySQL5Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
Oracle 12c org.hibernate.dialect.Oracle12cDialect
SQL Server org.hibernate.dialect.SQLServerDialect
H2 Database org.hibernate.dialect.H2Dialect
MariaDB org.hibernate.dialect.MariaDBDialect

Schema Generation Strategies (hbm2ddl.auto)

The hibernate.hbm2ddl.auto property controls how Hibernate manages database schema. This is crucial for development and production environments.

  • validate - Validate schema against entity mappings, throw exception if mismatch (recommended for production)
  • update - Update schema to match entities, never drops tables or columns (safe for development)
  • create - Drop existing schema and create new one on startup (data loss!)
  • create-drop - Create schema on startup, drop on shutdown (useful for testing)
  • none - No schema management, manual DDL required (production best practice)

Connection Pooling

Connection pooling reuses database connections instead of creating new ones for each request. This significantly improves performance. Hibernate's built-in pool is only for development; use C3P0, HikariCP, or DBCP2 for production.

C3P0 Connection Pool Setup

C3P0 Connection Pool Setup
<!-- Add C3P0 dependency -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.6.15.Final</version>
</dependency>

Connection Pooling - XML Configuration

Connection Pooling - XML Configuration
<!-- C3P0 properties in hibernate.cfg.xml -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">1</property>

Configuration Best Practices

  • Use environment-specific configs - Separate configurations for dev, test, and production
  • Externalize credentials - Store database passwords in environment variables or secure vaults
  • Enable SQL logging in development - Set show_sql=true and format_sql=true
  • Disable SQL logging in production - Improves performance and reduces log size
  • Use connection pooling - Always use C3P0, HikariCP, or similar in production
  • Set appropriate batch size - Use jdbc.batch_size for bulk operations
  • Enable second-level cache - For read-heavy applications with frequently accessed data
  • Use validate in production - Set hbm2ddl.auto=validate to prevent accidental schema changes
  • Configure session context - Use thread for standalone apps, jta for Java EE
  • Monitor connection pool - Track pool usage and adjust min/max sizes accordingly

Common Configuration Issues

Match the startup or runtime symptom to the configuration boundary before changing unrelated settings.

Cause Correction
Wrong dialect class or missing Hibernate dependency Verify the dialect and dependency versions against the Hibernate and database documentation.
Invalid JDBC URL, credentials, or missing driver Test the connection details and ensure the JDBC driver is on the runtime classpath.
Entity mappings differ from the schema while validation is enabled Align entity annotations and migrations with the deployed database schema.
Pool exhaustion or sessions left open Close sessions reliably, inspect transaction boundaries, and size the pool from measured concurrency.

Testing Configuration

Test Hibernate Configuration

Test Hibernate Configuration
package com.example.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.example.util.HibernateUtil;

public class TestHibernateConfig {

    public static void main(String[] args) {
        SessionFactory sessionFactory = null;
        Session session = null;

        try {
            // Get SessionFactory
            sessionFactory = HibernateUtil.getSessionFactory();
            System.out.println("SessionFactory created successfully!");

            // Open session
            session = sessionFactory.openSession();
            System.out.println("Session opened successfully!");

            // Test database connection
            session.doWork(connection -> {
                System.out.println("Database: " + connection.getMetaData().getDatabaseProductName());
                System.out.println("Driver: " + connection.getMetaData().getDriverName());
                System.out.println("URL: " + connection.getMetaData().getURL());
            });

            System.out.println("✓ Hibernate configuration is working correctly!");

        } catch (Exception e) {
            System.err.println("✗ Hibernate configuration failed!");
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
            if (sessionFactory != null) {
                sessionFactory.close();
            }
        }
    }
}

// Expected output:
// SessionFactory created successfully!
// Session opened successfully!
// Database: MySQL
// Driver: MySQL Connector/J
// URL: jdbc:mysql://localhost:3306/mydb
// ✓ Hibernate configuration is working correctly!
Before you move on

Hibernate Configuration cfg.xml C3P0 Pooling Mastery Check

5 checks
  • Hibernate configuration is the process of setting up Hibernate ORM framework to connect to a database and manage entity mappings.
  • Configuration defines database connection details, dialect, caching strategies, and other Hibernate-specific settings that control how the framework operates.
  • Proper configuration is essential for Hibernate to function correctly.
  • It tells Hibernate which database to connect to, how to generate SQL, whether to show SQL queries, and how to handle schema generation.
  • Configuration can be done through XML files (hibernate.cfg.xml), properties files, or programmatically using Java code.

Hibernate Questions Learners Ask

Automatic update tries to align the schema with mappings, but it does not provide a reviewed migration history, predictable data transformations, or reliable rollback. Complex renames and constraint changes may not be handled as intended. Use Flyway or Liquibase for production changes and keep Hibernate schema validation enabled to catch mismatches.

The dialect tells Hibernate which SQL syntax, data types, pagination rules, identity features, and database functions are supported. A dialect for another database or version can produce SQL that compiles in Hibernate but fails at the server. Prefer automatic detection when supported, or configure the exact database family and verify generated DDL and queries.

Too few connections make requests wait; too many can overwhelm the database and increase contention.

Next Step
Next Practice

Finish the concept here, then reinforce it with hands-on coding, interview prep, or a tool that matches the topic.

Browse Free Tutorials

Explore 500+ free tutorials across 20+ languages and frameworks.