如何使用TomEE与Hibernate

9
我用持久化上下文(提供者为Hibernate)创建了一个非常简单的应用程序,以从数据库中读取一些值。我使用带有Maven的Eclipse。
首先,我获取
Caused by: org.apache.openejb.OpenEJBException: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider:

根据这个主题,我排除了hibernate-jpa-2.0-api。现在我的依赖项如下: http://openejb.979440.n4.nabble.com/problem-with-hibernate-persistence-provider-td980429.html
<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>

现在,我不知道为什么...
Caused by: java.lang.ClassNotFoundException: org.hibernate.transaction.TransactionManagerLookup

但是TransactionManagerLookup在hibernate-core中。 请问,如何编写pom.xml来在TomEE中使用Hibernate?


使用TomEE,我正在尝试运行带有Hibernate作为JPA提供程序的简单应用程序。现在,我不知道应该包括哪些依赖项和排除哪些依赖项。由TomEE提供的库与来自Maven的库产生了一些冲突,这就是为什么我必须排除一些库的原因。 - LancerX
你能否扩展“TransactionManagerLookup”异常的堆栈跟踪? - David Blevins
我复制了整个控制台 http://pastebin.com/MR1JDe8m - LancerX
我有完全相同的问题,真的很期待解决方案! - Pith
在禁用Maven依赖项并将所需的jar(hibernate,antlr)复制到tomee / lib文件夹后,它正在工作。 - LancerX
3个回答

17

1. 将所需的Hibernate .jars复制到<tomee-home>/lib

根据文档 ( http://tomee.apache.org/tomee-and-hibernate.html ),以下这些jar包已足够,并且实际上它们对我是有效的:

<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

所有这些.jars都包含在Hibernate ORM 4.2.x下载中(http://hibernate.org/orm/),除了Hibernate Validator,它是一个单独的下载(http://hibernate.org/validator/)。

2. 编辑你的pom.xml文件

使用作用域为providedjavaee-api maven库,现在您可以在项目中使用JPA规范。然而,如果您之前使用了一些特定于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. 定义数据库连接

编辑<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>

你也可以将上面的<Resource>...</Resource>定义放入WEB-INF/resources.xml中,并随应用程序一起发布:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <!-- Put <Resource> elements here -->
<resources>

4. JTA数据源

现在您已经告诉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. 开始使用JPA

在CDI bean或EJB中获取EntityManager的方法如下:

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

最终说明

Hibernate版本4.3+

我正在使用Hibernate 4.2.21(JPA 2.0,Java EE 6)以及TomEE 1.7.2。任何TomEE 1.7.x、1.6.x和1.5.x都可以使用。但是,您不能使用Hibernate 4.3+(JPA 2.1 / Java EE 7),因为TomEE 1.7.x及以下版本仅支持Java EE 6。如果您真的想要在TomEE中使用Java EE 7功能,这篇博文可能会有所帮助: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已经包含了一个javassist-<version>.jar,所以您不必复制它。


1
它可以运行。在Google搜索中,我发现另一种对使用maven的开发人员有用的方法。您只需要使用configuration/libs/lib(请查看pom.xml)在tomee-maven-plugin上添加依赖项即可。 - Sixro

2

请尝试以下步骤:

添加以下jar包:

  • <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

注意:ehcache的jar包可能是可选的,但没有尝试过没有它们的情况。

删除以下jar包(可选):

  • <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

这些文件也可以打包在war文件中一起发布吗? - Axel Fontaine
1
嘿,Axel。将JPA提供程序放入WAR应该会起作用。 - David Blevins

0

是的,只需将 hibernate-jpa-2.1-api-1.0.0.Final.jar 放入 TomEE lib 文件夹中即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接