Hibernate 4.3.6+;Glassfish 4.1+;JPA 2.1

Hibernate 4.3.6+;Glassfish 4.1+;JPA 2.1,hibernate,glassfish,hibernate-4.x,jpa-2.1,glassfish-4.1,Hibernate,Glassfish,Hibernate 4.x,Jpa 2.1,Glassfish 4.1,我试图在JavaEE7应用程序中从EclipseLink迁移到Hibernate,但遇到了一些我无法解决的问题 这里是我的环境: 玻璃鱼4.1 休眠4.3.6 Java 1.8.0_20 我还使用: EE 7 CDI JPA 2.1 最终,我们的目标是能够使用Java8流和Lambdas,因为我们的应用程序有很多集合操作,而EclipseLink目前不支持流。我们有另一个使用Hibernate(在Wildfly上)运行的项目可以实现这一点,但希望我们可以迁移到Hibernate,而不是交

我试图在JavaEE7应用程序中从EclipseLink迁移到Hibernate,但遇到了一些我无法解决的问题

这里是我的环境:

  • 玻璃鱼4.1
  • 休眠4.3.6
  • Java 1.8.0_20
我还使用:

  • EE 7
  • CDI
  • JPA 2.1
最终,我们的目标是能够使用Java8流和Lambdas,因为我们的应用程序有很多集合操作,而EclipseLink目前不支持流。我们有另一个使用Hibernate(在Wildfly上)运行的项目可以实现这一点,但希望我们可以迁移到Hibernate,而不是交换整个JavaEE应用服务器堆栈

到目前为止,我已经完成了以下工作,但主要遵循以下指南:

  • 我已将必需的和entity manager Hibernate JAR安装到我的/glassfish/lib目录中

  • 我在persistence.xml中修改了持久性单元,如下所示:

    <persistence-unit name="mypu" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/myds</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.SunOneJtaPlatform" />
    <property name="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory"/>
    <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
    </persistence-unit>
    
    
    org.hibernate.jpa.HibernatePersistenceProvider
    jdbc/myds
    假的
    
  • 现在我得到的第一个例外是“java.lang.IllegalArgumentException:不是实体:…”,但是我的类都用@entity注释,并且在EclipseLink下工作。我不认为我应该用exclude unlisted classes=false列出我的类,我真的希望避免这样做

    编辑:根据unwichtich的建议,我尝试添加:

        <property name="hibernate.archive.autodetection" value="class, hbm"/>
    
    
    
    并在persistence.xml中单独指定PU中的类,没有任何改进


    谢谢您的帮助。

    您说得对,这应该可以与您的设置配合使用

    然而,可能是由于某种原因Hibernate无法发现您的实体

    您可以在
    persistence.xml
    中使用此属性显式启用Hibernate的实体自动发现:

    <property name="hibernate.archive.autodetection" value="class, hbm"/>
    
    
    
    这也应该是默认值,即使您没有声明它

    如果您的实体类位于一个单独的jar文件中,您必须像这样声明它:

    <property name="hibernate.archive.autodetection" value="class, hbm, jar"/>
    
    <class>com.model.Entity</class>
    
    
    
    如果没有任何帮助,您可以像下面这样手动声明您的类:

    <property name="hibernate.archive.autodetection" value="class, hbm, jar"/>
    
    <class>com.model.Entity</class>
    
    com.model.Entity
    
    在重新部署项目之前,不要忘记清理和构建项目

    另请参见:


    问题似乎是Hibernate 4.3.6+版本中的一个bug。我也遇到了同样的问题,在一整天的休息之后,我试图更改Hibernate的版本(当时使用的是4.3.7)。经过一些测试,我注意到4.3.5版本运行平稳。正如您介绍的那样,使用EclipseLink也没有任何问题

    我试图分析Hibernate源代码,但没有找到问题。无论如何,即使这不是一个永久的解决方案,也可以是一个变通办法。在我的例子中,我将项目更改为使用Hibernate 4.3.5


    我希望你喜欢。

    你是把它包装成战争还是耳朵?战争-但是现在它在发展过程中是一场爆炸性的战争。你在玻璃鱼4中加入冬眠有没有进一步的进展?@peter_pilgrim我们暂时把它放在桌面上,现在仍然处于日食状态。我们的计划是迁移到WildFly,以便获得更好的Java8支持。运气不好,但是我现在看到了两个不同的异常,1)我以前遇到的IllegalRugmentException,2)稍微不同的变体“java.lang.IllegalStateException:EntityManagerFactory已关闭”。我开始怀疑GF 4.1和Hibernate 4.3.6之间是否存在缺陷/不兼容。我还应该注意,在启动服务器和部署时出现错误#1,在尝试重新部署时出现错误#2。另外-我没有提到。。我也在使用CDI,这可能也会对这一点造成影响。