简体   繁体   English

如何在Hibernate中使用TomEE

[英]How to use TomEE with Hibernate

I have created very simple app with persistence context (hibernate as provider) to read some value from database. 我创建了一个非常简单的应用程序,使用持久化上下文(hibernate as provider)从数据库中读取一些值。 I use Eclipse with Maven. 我将Eclipse与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. 并根据这个主题http://openejb.979440.n4.nabble.com/problem-with-hibernate-persistence-provider-td980429.html我排除了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. 但是TransactionManagerLookup处于hibernate核心。 Please, can anybody tell me, how should look pom.xml to use hibernate in TomEE? 请问,任何人都可以告诉我,在TomEE中如何看待pom.xml使用hibernate?

1. Copy the required Hibernate .jars to <tomee-home>/lib 1.将所需的Hibernate .jars复制到<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: 根据文档( http://tomee.apache.org/tomee-and-hibernate.html ),以下内容就足够了,实际上它们对我有用:

<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/ ). 所有这些.jars都包含在Hibernate ORM 4.2.x下载( http://hibernate.org/orm/ )中,但Hibernate Validator除外,它是一个单独的下载( http://hibernate.org/validator/ ) 。

2. Edit your pom.xml 2.编辑您的pom.xml

Using the javaee-api maven artifact with a scope of provided you can now use the JPA specification in your project. 使用provided范围的javaee-api maven工件,您现在可以在项目中使用JPA规范。 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: 但是,如果您以前使用过一些特定于Hibernate的特性,类或注释,您仍然可以在pom.xml引用Hibernate来匹配这些依赖项:

<!-- 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 3.定义数据库连接

Edit <tomee-home>/conf/tomee.xml : 编辑<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: 您还可以将上面的<Resource>...</Resource>定义放入WEB-INF/resources.xml并将其与您的应用程序一起发送:

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

4. JTA Datasource 4. JTA数据源

Now that you told TomEE how to establish a connection, define a JTA datasource in /src/main/java/META-INF/persistence.xml : 既然您告诉TomEE如何建立连接,请在/src/main/java/META-INF/persistence.xml定义JTA数据源:

<?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 5.开始使用JPA

Obtain an EntityManager in a CDI bean or EJB like this: 在CDI bean或EJB中获取EntityManager ,如下所示:

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

Final Notes 最后的笔记

Hibernate versions 4.3+ Hibernate版本4.3+

I am using Hibernate 4.2.21 (JPA 2.0, Java EE 6) along with TomEE 1.7.2. 我正在使用Hibernate 4.2.21(JPA 2.0,Java EE 6)和TomEE 1.7.2。 Any TomEE 1.7.x, 1.6.x and 1.5.x will work. 任何TomEE 1.7.x,1.6.x和1.5.x都可以使用。 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/ 但是,您不能使用Hibernate 4.3+(JPA 2.1 / Java EE 7),因为TomEE 1.7.x及更低版本仅支持Java EE 6.如果您确实希望将Java EE 7功能与TomEE一起使用,则此博客文章可能会有所帮助: 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

TomEE 1.5.x already includes a javassist-<version>.jar , so you don't have to copy one. TomEE 1.5.x已经包含了一个javassist-<version>.jar ,因此您不必复制一个。

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. ehcache 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

是的只是将hibernate-jpa-2.1-api-1.0.0.Final.jar放入为我工作的TomEE lib文件夹中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM