【问题标题】:Is there a way to use Hibernate 4.2.2 with Java EE 7 and Glassfish 4?有没有办法将 Hibernate 4.2.2 与 Java EE 7 和 Glassfish 4 一起使用?
【发布时间】:2013-06-28 19:43:53
【问题描述】:

我使用 Java EE 7 和 Hibernate 4.2.2 和 Glassfish 4 创建了一个小型测试项目。

这是我的 pom.xml (网络)

 <dependencies>        
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>br.com.myproject</groupId>
        <artifactId>escola-ejb</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

ejb

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>
<!--Hibernate-->     
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.2.2.Final</version>
    <scope>compile</scope>
</dependency>

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.2.Final</version>
        <scope>compile</scope>
</dependency>

它只有一个名为 Student 的实体。还有一些带有列表、创建和编辑的杂乱无章的页面。 我可以编译和部署,但是当我尝试打开列表列表页面(由 netbeans 7.3.1 生成的所有页面,带有从实体模型生成 JSF 页面的选项)时,我收到了一个错误:

A system exception occurred during an invocation on EJB StudentFacade, method: public java.util.List br.com.myproject.ejb.facade.AbstractFacade.findRange(int[]).
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
    at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)

(...)

如果我将 persistence.xml 更改为 Eclipse 链接,它可以正常工作。但是我回滚到休眠状态。我收到了这个错误。

我在 Google 上搜索了很多信息,但找不到任何信息,因为 Java EE 7 是一项新技术。

【问题讨论】:

  • 有人可以创建标签 JEE7 吗?
  • 有谁知道如何使用 JTS 和 eclipselink?

标签: hibernate-4.x java-ee-7 glassfish-4


【解决方案1】:

Hibernate 4.2.2 与 JPA 2.0 兼容。 Glassfish 4 和 EE 7 附带 JPA 2.1。为此,您需要 Hibernate 4.3.0.Beta1 或更高版本。

它可能适用于早期版本的 Hibernate,但您很可能会遇到问题。 我建议等到他们发布 Hibernate 的 4.3 最终版本。

【讨论】:

  • 我已经尝试使用 4.3.0.Beta5 并且没有成功。我能够部署,但无法从数据库中获取任何数据。
  • 遇到了同样的问题,然后向我以前的 Java 老师求助。他告诉我 Hibernate 4.3.0.Beta5 没有构建一个完整的工作应用程序所需的所有实现,所以我必须迁移到最新的 EclipseLink 才能继续使用 GlassFish 4 和 JEE7。完成后发现 EclipseLink 比 Hibernate 快得多,而且它是参考实现。
  • 现在有 Hibernate 4.3.1 Final。但还没有尝试过。
【解决方案2】:

仅将 Hibernate 作为依赖项添加到您的应用程序是行不通的。您要么必须将 Hibernate JAR 添加到 GlassFish 的服务器类路径(在这种情况下,Hibernate 将作为所有应用程序的 JPA 提供程序),或者将 Hibernate JAR 捆绑在 EAR 的 lib 目录中(在这种情况下,只有该应用程序可以使用休眠)。有关后一种情况的示例,请参见此博客: http://javafromthetrenches.wordpress.com/2011/01/15/using-hibernate-jpa-with-glassfish/

您不需要做任何特别的事情来使用 JTA 和 EclipseLink(或 Hibernate)数据源。会话 bean 是自动事务性的,因此将实体管理器实例注入您的会话 bean 并从业务方法中使用它。

我还应该指出,如果您不使用默认 Java DB 数据库,则需要将 JDBC 资源添加到 GlassFish。

【讨论】:

  • 恰恰相反,这正是重点。如果要使用备用 JPA 层,则需要确保您的应用程序和 GlassFish 配置正确。我这样说是因为您声明 EclipseLink 有效,但 Hibernate 无效。如果您深入研究 GlassFish 的 server.log 文件,您可能会看到在 List 视图上调用 StudentFacade 时引发异常的根本原因。
  • 正如许多其他用户所说,这里的问题是不兼容的休眠版本。
  • 您的 EAR 是否正确配置为使用上述博客文章中描述的 maven-ear-plugin 捆绑 Java EE 7 兼容版本的 Hibernate?
猜你喜欢
  • 2013-10-24
  • 2011-03-28
  • 2020-11-05
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 2013-05-09
  • 2018-03-15
  • 2016-11-01
相关资源
最近更新 更多