Apache TomEE ships with OpenJPA as the default JPA provider, however any valid JPA provider can be used.
The basic steps are:
<tomee-home>/lib/
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
fileMETA-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
<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:
<property name="hibernate.transaction.manager_lookup_class"
value="org.apache.openejb.hibernate.TransactionManagerLookup"/>
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.
javax.persistence.provider
javax.persistence.transactionType
javax.persistence.jtaDataSource
javax.persistence.nonJtaDataSource
So, for example, Hibernate can become the default provider via setting
CATALINA_OPTS=-Djavax.persistence.provider=org.hibernate.ejb.HibernatePersistence
You must of course add the Hibernate libraries to <tomee-home>/lib/
for this to work.
Jars needed for Hibernate 4.x:
Add:
<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
Remove (optional):
<tomee-home>/lib/asm-3.2.jar
<tomee-home>/lib/bval-core-0.4.jar
<tomee-home>/lib/bval-jsr303-0.4.jar
<tomee-home>/lib/commons-lang-2.6.jar
<tomee-home>/lib/openjpa-2.2.0.jar
<tomee-home>/lib/serp-1.13.1.jar
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
To use Infinispan cache (default Hibernate 2nd level cache) you need the below jars:
org.infinispan:infinispan-core:5.1.4.FINAL
org.hibernate:hibernate-infinispan:${hibernate.core.version}
org.jgroups:jgroups:3.0.9.Final
org.jboss.marshalling:jboss-marshalling-river:1.3.11.GA:
org.jboss.marshalling:jboss-marshalling:1.3.11.GA
org.codehaus.woodstox:woodstox-core-asl:4.1.1
org.codehaus.woodstox:stax2-api:3.1.1
org.rhq.helpers:rhq-pluginAnnotations:3.0.4
org.jboss.logmanager:jboss-logmanager:1.2.2.GA
There is 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. Be sure to put your DB driver in <tomee-home>/lib
.