How to use TomEE with Hibernate

2019-01-09 01:57发布

问题:

I have created very simple app with persistence context (hibernate as provider) to read some value from database. I use Eclipse with Maven.

First, I get

Caused by: org.apache.openejb.OpenEJBException: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider:

and according to this topic http://openejb.979440.n4.nabble.com/problem-with-hibernate-persistence-provider-td980429.html I excluded hibernate-jpa-2.0-api. Now, my dependencies look

<dependency>
 <groupId>postgresql</groupId>
 <artifactId>postgresql</artifactId>
 <version>9.1-901.jdbc4</version>
</dependency>

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-entitymanager</artifactId>
 <version>4.1.3.Final</version>
  <exclusions>
    <exclusion>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.0-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Now, I don't know why...

Caused by: java.lang.ClassNotFoundException: org.hibernate.transaction.TransactionManagerLookup

But TransactionManagerLookup is in hibernate-core. Please, can anybody tell me, how should look pom.xml to use hibernate in TomEE?

回答1:

Try this:

Add:

  • <tomee-home>/lib/antlr-2.7.7.jar
  • <tomee-home>/lib/dom4j-1.6.1.jar
  • <tomee-home>/lib/ehcache-core-2.5.1.jar
  • <tomee-home>/lib/ehcache-terracotta-2.5.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-ehcache-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
  • <tomee-home>/lib/terracotta-toolkit-1.4-runtime-4.1.0.jar

The ehcache jars might be optional, but haven't tried without them.

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


回答2:

1. Copy the required Hibernate .jars to <tomee-home>/lib

According to the documentation ( http://tomee.apache.org/tomee-and-hibernate.html ), the following ones are sufficient and in fact they worked for me:

<tomee-home>/lib/antlr-2.7.7.jar
<tomee-home>/lib/dom4j-1.6.1.jar
<tomee-home>/lib/hibernate-commons-annotations-4.0.2.Final.jar
<tomee-home>/lib/hibernate-core-4.2.21.Final.jar
<tomee-home>/lib/hibernate-entitymanager-4.2.21.Final.jar
<tomee-home>/lib/hibernate-validator-4.3.2.Final.jar
<tomee-home>/lib/javassist-3.18.1-GA.jar
<tomee-home>/lib/jboss-logging-3.1.0.GA.jar

All these .jars are contained in the Hibernate ORM 4.2.x download ( http://hibernate.org/orm/ ), except for the Hibernate Validator, which is a separate download ( http://hibernate.org/validator/ ).

2. Edit your pom.xml

Using the javaee-api maven artifact with a scope of provided you can now use the JPA specification in your project. However, if you have been using some Hibernate specific features, classes or annotations before, you can still refer to Hibernate in your pom.xml to match those dependencies:

<!-- JPA spec (required) -->
<dependencies>
    <dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0-4</version>
    <scope>provided</scope>
</dependency>
<!-- Hibernate specific features (only if needed) -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.21.Final</version>
    <scope>provided</scope>
</dependency>

3. Define your database connection

Edit <tomee-home>/conf/tomee.xml:

<Resource id="myJtaDatabase" type="DataSource">
    JdbcDriver  com.mysql.jdbc.Driver
    JdbcUrl jdbc:mysql://localhost:3306/my_dbname?autoReconnect=true
    UserName foo
    Password bar
    validationQuery = SELECT 1
    JtaManaged true
</Resource>

You can also put the above <Resource>...</Resource> definition into WEB-INF/resources.xml and ship it with your application instead:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <!-- Put <Resource> elements here -->
<resources>

4. JTA Datasource

Now that you told TomEE how to establish a connection, define a JTA datasource in /src/main/java/META-INF/persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">

    <persistence-unit name="my_persistence_unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:openejb/Resource/myJtaDatabase</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <!-- As many hibernate properties as you need, some examples: -->
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="true" />
            <!-- Drop and then re-create the database schema (don't do this in production) -->
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>
</persistence>

5. Start using JPA

Obtain an EntityManager in a CDI bean or EJB like this:

@PersistenceContext(unitName = "my_persistence_unit")
private EntityManager em;

Final Notes

Hibernate versions 4.3+

I am using Hibernate 4.2.21 (JPA 2.0, Java EE 6) along with TomEE 1.7.2. Any TomEE 1.7.x, 1.6.x and 1.5.x will work. However, you cannot use Hibernate 4.3+ (JPA 2.1 / Java EE 7), as TomEE 1.7.x and below only support Java EE 6. If you really want to use Java EE 7 features along with TomEE, this blog post might be helpful: http://rmannibucau.wordpress.com/2013/07/19/little-tip-to-help-you-to-test-javaee-7-in-tomee-with-tomee-maven-plugin/

TomEE 1.5.x

TomEE 1.5.x already includes a javassist-<version>.jar, so you don't have to copy one.



回答3:

yes just dropping the hibernate-jpa-2.1-api-1.0.0.Final.jar into the TomEE lib folder worked for me.