9

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?

Jack
  • 1,881
  • 24
  • 29
LancerX
  • 1,211
  • 7
  • 23
  • 40
  • Using TomEE, I'm trying to run simple application with hibernate as jpa provider. Now, I don't know which dependecies should be include and which exclude. Libraries provided by TomEE make some conflicts with lib from maven, that is why I have to exclude some libs. – LancerX Jun 01 '12 at 15:44
  • Can you expand the stacktrace on the 'TransactionManagerLookup' exception? – David Blevins Jun 02 '12 at 00:17
  • I pasted entire console http://pastebin.com/MR1JDe8m – LancerX Jun 02 '12 at 10:24
  • I have exactly the same problem and I'm really waiting for the solution ! – Pith Jun 08 '12 at 12:12
  • It is working after I disabled maven dependencies and copied needed jar (hibernate, antlr) to tomee/lib folder. – LancerX Jun 16 '12 at 22:20

3 Answers3

17

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.

Jack
  • 1,881
  • 24
  • 29
  • 1
    It runs. Googling around I have found another approach useful for developers using maven. You need simply to add dependencies on the `tomee-maven-plugin` using ```configuration/libs/lib``` (look at the [pom.xml](https://github.com/rsimoni/demo-tomee-hibernate/blob/master/pom.xml)) – Sixro Oct 15 '13 at 10:27
2

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
David Blevins
  • 19,178
  • 3
  • 53
  • 68
0

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