= TomEE and Hibernate
:index-group: JPA
:jbake-date: 2018-12-05
:jbake-type: page
:jbake-status: published


Apache TomEE ships with OpenJPA as the default JPA provider, however any
valid JPA 2.0 provider can be used.

The basic steps are:

[arabic]
. Add the Hibernate jars to `<tomee-home>/lib/`
. Configure the webapp or the server to use Hibernate

*The atifact versions defined here are just for example, so please feel
free to use current library versions.*

== Webapp Configuration

Any webapp can specify the JPA provider it would like to use via the
`persistence.xml` file, which can be at any of the following locations
in a webapp

* `WEB-INF/persistence.xml` of the `.war` file
* `META-INF/persistence.xml` in any jar located in `WEB-INF/lib/`

A single webapp may have many `persistence.xml` files and each may use
whichever JPA provider it needs.

The following is an example of a fairly common `persistence.xml` for
Hibernate

[source,xml]
----
<persistence version="1.0"
       xmlns="http://java.sun.com/xml/ns/persistence"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

  <persistence-unit name="movie-unit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>movieDatabase</jta-data-source>
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>

    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
  </persistence-unit>
</persistence>
----

Note, TomEE will automatically add the following property unless it is
explicitly configured:

[source,xml]
----
      <property name="hibernate.transaction.manager_lookup_class"
                value="org.apache.openejb.hibernate.TransactionManagerLookup"/>
----

For Hibernate 5 the following property needs to be explicitly added it either as system property or persistence unit.
----
<property name="tomee.jpa.factory.lazy" value="true"/>
----

== Server Configuration

The default JPA provider can be changed at the server level to favor
Hibernate over OpenJPA.

Using the `<tomee-home>/conf/system.properties` file or any other valid
means of setting `java.lang.System.getProperties()`, the following
standard properties can set the detault for any `persistence.xml` file.

* `jakarta.persistence.provider`
* `jakarta.persistence.transactionType`
* `jakarta.persistence.jtaDataSource`
* `jakarta.persistence.nonJtaDataSource`

So, for example, Hibernate can become the default provider via setting

`CATALINA_OPTS=-Djakarta.persistence.provider=org.hibernate.ejb.HibernatePersistence`

You *must* of course add the Hibernate libraries to `<tomee-home>/lib/`
for this to work.

== Hibernate libraries

Jars needed for Hibernate 4.x:

* `<tomee-home>/lib/antlr-2.7.7.jar`
* `<tomee-home>/lib/dom4j-1.6.1.jar`
* `<tomee-home>/lib/hibernate-commons-annotations-4.0.1.Final.jar`
* `<tomee-home>/lib/hibernate-core-4.1.4.Final.jar`
* `<tomee-home>/lib/hibernate-entitymanager-4.1.4.Final.jar`
* `<tomee-home>/lib/hibernate-validator-4.3.0.Final.jar`
* `<tomee-home>/lib/jboss-logging-3.1.0.GA.jar`

Jars needed for Hibernate 5.x:

* `<tomee-home>/lib/antlr-2.7.7.jar`
* `<tomee-home>/lib/dom4j-1.6.1.jar`
* `<tomee-home>/lib/hibernate-commons-annotations-5.1.0.Final.jar`
* `<tomee-home>/lib/hibernate-core-5.4.10.Final.jar`
* `<tomee-home>/lib/hibernate-entitymanager-5.4.10.Final.jar`
* `<tomee-home>/lib/hibernate-validator-5.1.3.Final.jar`
* `<tomee-home>/lib/jboss-logging-3.3.2.Final`
* `<tomee-home>/lib/jandex-1.1.0.Final.jar`
* `<tomee-home>/lib/javassist-3.18.1-GA.jar`
* `<tomee-home>/lib/byte-buddy-1.10.2.jar`
* `<tomee-home>/lib/classmate-1.0.0.jar`

Remove (optional):

* `<tomee-home>/lib/asm-3.2.jar`
* `<tomee-home>/lib/openjpa-2.2.0.jar`

== Ehcache (optional)

To use Hibernate with Ehcache, add:

* `<tomee-home>/lib/hibernate-ehcache-4.1.4.Final.jar`
* `<tomee-home>/lib/ehcache-core-2.5.1.jar`
* `<tomee-home>/lib/ehcache-terracotta-2.5.1.jar`
* `<tomee-home>/lib/terracotta-toolkit-1.4-runtime-4.1.0.jar`

== Infinispan (optional)

To use Infinispan cache (default Hibernate 2nd level cache) you need the
below jars:

There are many guides on how to use 2nd level cache with JPA 2. You can
remove OpenJPA jar so less jars are in `<tomee-home>/lib` folder. Also,
be sure to put your Database JDBC driver in `<tomee-home>/lib`.

The actual Maven dependencies for your project can be added in the usual
way:

[source,xml]
----
    <!-- Hibernate -->      
    <dependency>
        <groupId>antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>2.7.7</version>
    </dependency>       
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>4.0.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.2.16.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.2.16.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.16.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.3.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.1.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.15.0-GA</version>
    </dependency>
----
