README.adoc

June 15, 2026 ยท View on GitHub

== Hibernate ORM

image:https://img.shields.io/maven-central/v/org.hibernate.orm/hibernate-core.svg?label=Maven%20Central&style=for-the-badge[Maven Central,link=https://central.sonatype.com/search?namespace=org.hibernate.orm&sort=name] image:https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.hibernate.org%2Fjob%2Fhibernate-orm-pipeline%2Fjob%2Fmain%2F&style=for-the-badge[Build Status,link=https://ci.hibernate.org/job/hibernate-orm-pipeline/job/main/] image:https://img.shields.io/badge/Revved%20up%20by-Develocity-06A0CE?style=for-the-badge&logo=gradle[Develocity,link=https://develocity.commonhaus.dev/scans?search.rootProjectNames=Hibernate%20ORM] image:https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/jvm-repo-rebuild/reproducible-central/master/content/org/hibernate/orm/hibernate-core/badge.json&style=for-the-badge[Reproducible Builds,link=https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/hibernate/orm/hibernate-core/README.md] image:https://testpilot.oracle.com/ords/testpilot/badges/github/hibernate/hibernate-orm[Oracle Test Pilot,link=https://testpilot.oracle.com/]

Hibernate ORM is a powerful object/relational mapping solution for Java, the de facto standard implementation of the https://www.oracle.com/java/technologies/persistence-jsp.html[Java Persistence API] (now also known as https://jakarta.ee/specifications/persistence/4.0/[Jakarta Persistence]), https://jakarta.ee/specifications/query/1.0/[Jakarta Query], and https://jakarta.ee/specifications/data/1.1/[Jakarta Data].

Hibernate exposes relational data in a natural and type safe form,

  • making it easy to write complex queries and work with their results,
  • letting the program easily synchronize changes made in memory with the database,
  • respecting the ACID properties of transactions,
  • automatically handling temporal data and audit logging,
  • taking care of multi-tenancy and row-level security,
  • and allowing performance optimizations to be made after the basic persistence logic has already been written.

Hibernate is the best way for a program written in Java to take advantage of the power of the relational model, and of the expressivity of SQL, without sacrificing performance or code reuse.

See https://hibernate.org/orm/[hibernate.org] for more information.

== Getting started

Documentation for Hibernate ORM is available at:

https://hibernate.org/orm/documentation

https://github.com/hibernate/hibernate-orm/blob/main/documentation/src/main/asciidoc/introduction/Configuration.adoc[This page] explains how to include Hibernate ORM in a Java project and configure a connection to the database.

== Building from sources

The build requires at least JDK 25, and produces Java 17 bytecode.

Hibernate uses https://gradle.org[Gradle] as its build tool. See the Gradle Primer section below if you're new to Gradle.

Contributors should read the link:CONTRIBUTING.md[Contributing Guide].

See the guides for setting up https://hibernate.org/community/contribute/intellij-idea/[IntelliJ] or https://hibernate.org/community/contribute/eclipse-ide/[Eclipse] as your development environment.

== Gradle Primer

The Gradle build tool has excellent documentation.

Here we summarize the features you'll need to get started in this project.

NOTE: The project has a https://docs.gradle.org/current/userguide/gradle_wrapper.html[Gradle Wrapper]. The rest of the section will assume execution via the wrapper.

=== Executing Tasks

To print a list of available build tasks, execute:


./gradlew tasks

To execute a task across all modules, simply execute the task from the root directory.


cd hibernate-orm ./gradlew build

Gradle visits each subproject and executes the task if the subproject defines it.

To execute a task in a specific module, either:

  • cd into that module directory and execute the task, or
  • explicitly qualify the task name with the name of the module.

For example, to run the tests for the hibernate-core module from the root directory you could type:


./gradlew hibernate-core:test

=== Common tasks

The common tasks you might use in building Hibernate include:

build :: Assembles (jars) and tests this project compile :: Performs all compilation tasks including staging resources from both main and test jar :: Generates a jar archive with all the compiled classes test :: Runs the tests publishToMavenLocal or pTML :: Installs the project jar to your local Maven cache at ~/.m2/repository. Note that Gradle never uses this, but it can be useful for testing a build with other local Maven-based builds. clean :: Cleans the build directory

== Testing and databases

Testing Hibernate against an embedded h2 database is easy. Just run:


./gradlew test

To run against another database:

  1. <<start-test-database,start the database>> using podman or docker, and then
  2. run the tests with the correct <<profiles,profile>> for that database.

=== Using profiles [[profiles]]

The Hibernate build defines several database testing profiles in local.databases.gradle. A profile may be activated by name using the db build property which can be passed either:

  • as a JVM system property -Ddb=..., or
  • as a Gradle project property -Pdb=....

Examples below use the Gradle project property.


gradle clean build -Pdb=postgresql

To run a test from your IDE, you need to ensure the property expansions happen. Use the following command:


gradle clean compile -Pdb=postgresql

NOTE: To run tests against a JDBC driver that is not available via Maven central, add the driver to your local Maven repository (~/.m2/repository) or to a personal Maven repository server.

=== Starting a test database as a container [[start-test-database]]

If podman or docker is installed, there's no need to install any database to test Hibernate. The script db.sh starts a preconfigured database which can be used for testing.

Simply run the following command:


./db.sh postgresql

Running ./db.sh without an argument prints a list of available database configurations.

By default, ./db.sh kills any previously started database. To keep multiple databases running, use --keep-orphans or -k:


./db.sh -k postgresql ./db.sh -k mysql

When the database is properly started, run tests with the corresponding profile, for example, -Pdb=postgresql for PostgreSQL. The system property dbHost configures the IP address of your docker host.

The command for running tests might look like the following:


./gradlew test -Pdb=postgresql "-DdbHost=192.168.99.100"

The following table illustrates a list of commands for various databases that can be tested locally.

|=== |Database |Start database |Run tests

H2
./gradlew test -Pdb=h2
HSQLDB
./gradlew test -Pdb=hsqldb
Apache Derby
./gradlew test -Pdb=derby

|MySQL |./db.sh mysql |./gradlew test -Pdb=mysql

|MariaDB |./db.sh mariadb |./gradlew test -Pdb=mariadb

|PostgreSQL |./db.sh postgresql |./gradlew test -Pdb=postgresql

|EnterpriseDB |./db.sh edb |./gradlew test -Pdb=edb

|Oracle |./db.sh oracle |./gradlew test -Pdb=oracle

|DB2 |./db.sh db2 |./gradlew test -Pdb=db2

|SQL Server |./db.sh mssql |./gradlew test -Pdb=mssql

|Sybase ASE (jTDS) |./db.sh sybase |./gradlew test -Pdb=sybase

|Sybase ASE (jConnect) |./db.sh sybase |./gradlew test -Pdb=sybase_jconn

|SAP HANA |./db.sh hana |./gradlew test -Pdb=hana

|CockroachDB |./db.sh cockroachdb |./gradlew test -Pdb=cockroachdb

|TiDB |./db.sh tidb |./gradlew test -Pdb=tidb

|Informix |./db.sh informix |./gradlew test -Pdb=informix

|Spanner PostgreSQL |./db.sh spanner_pg |./gradlew test -Pdb=spannerpgsql

|CUBRID |./db.sh cubrid |./gradlew test -Pdb=cubrid |===

Stopping a test database

To stop a container, use the stop command. For example:

[source]

podman stop mariadb

Substitute docker for podman if appropriate.

== Continuous Integration

See link:MAINTAINERS.md#ci[MAINTAINERS.md] for information about CI.