Hibernate 4.3.6 + Glassfish 4.1 + JPA 2.1

时间:2014-10-30 17:47:07

标签: hibernate glassfish hibernate-4.x jpa-2.1 glassfish-4.1

我试图在我的Java EE 7应用程序中从EclipseLink迁移到Hibernate并遇到一些我无法弄清楚的问题。

这是我的环境:

  • Glassfish 4.1
  • Hibernate 4.3.6
  • Java 1.8.0_20

我也在使用:

  • EE 7
  • CDI
  • JPA 2.1

最终我们的目标是能够使用Java 8 Streams和Lambdas,因为我们的应用程序有很多设置操作,而EclipseLink目前不支持Streams。我们有另一个运行Hibernate(在Wildfly上)的项目,但我希望我们可以迁移到Hibernate而不是交换整个Java EE App Server Stack。

到目前为止,我已经做了什么,但大部分都遵循了这里的指导:https://coderwall.com/p/e5fxrw

  1. 我已将必需的实体管理器Hibernate jar安装到my / glassfish / lib目录中。

  2. 我已经在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>
    
  3. 现在我得到的第一个例外是&#34; java.lang.IllegalArgumentException:不是实体:...&#34;但是我的类都使用@Entity注释,并且在EclipseLink下工作。我不认为我应该用exclude-unlisted-classes = false列出我的类,并且真的想避免这种情况。

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

        <property name="hibernate.archive.autodetection" value="class, hbm"/>
    

    并在persistence.xml中单独指定PU中的类,但没有任何改进。

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题似乎是Hibernate 4.3.6+版本中的一个错误。我遇到了同样的问题(打破了一整天后),我试图改变Hibernate的版本(使用4.3.7)。经过一些测试后,我注意到4.3.5版本运行顺利。正如您使用EclipseLink提出的那样也没有任何问题。

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

我希望你喜欢。

答案 1 :(得分:0)

你是对的,这适用于你的设置。

但是,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>

别忘了清洁&amp; amp;在重新部署项目之前构建项目。

另见: