0

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

这是我的环境:

  • 玻璃鱼 4.1
  • 休眠 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 应用程序服务器堆栈。

到目前为止,这是我所做的,但主要遵循这里的指导:https ://coderwall.com/p/e5fxrw

  1. 我已将所需的实体管理器 Hibernate jar 安装到我的 /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>
    

现在我得到的第一个异常是“java.lang.IllegalArgumentException:不是实体:......”但是我的类都用@Entity注释,并且在EclipseLink下工作。我认为我不应该用 exclude-unlisted-classes = false 列出我的类,并且真的很想避免这种情况。

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

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

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

感谢您的任何帮助。

4

2 回答 2

1

该问题似乎是 Hibernate 4.3.6+ 版本中的错误。我遇到了同样的问题,并且(在头疼了一整天之后),我尝试更改 Hibernate 的版本(使用的是 4.3.7)。经过一些测试,我注意到 4.3.5 版本运行流畅。就像您使用 EclipseLink 介绍的一样,也没有任何问题。

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

我希望你喜欢。

于 2014-11-28T16:52:01.073 回答
0

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

但是,Hibernate 可能以某种方式无法发现您的实体。

您可以使用以下属性为 Hibernate 显式启用实体自动发现persistence.xml

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

这也应该是默认值,即使您没有声明它。

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

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

如果没有任何帮助,您可以像这样手动声明您的类:

<class>com.model.Entity</class>

不要忘记在重新部署之前清理和构建您的项目。

也可以看看:

于 2014-10-30T21:47:34.423 回答