我试图在我的Java EE 7应用程序中从EclipseLink迁移到Hibernate并遇到一些我无法弄清楚的问题。
这是我的环境:
我也在使用:
最终我们的目标是能够使用Java 8 Streams和Lambdas,因为我们的应用程序有很多设置操作,而EclipseLink目前不支持Streams。我们有另一个运行Hibernate(在Wildfly上)的项目,但我希望我们可以迁移到Hibernate而不是交换整个Java EE App Server Stack。
到目前为止,我已经做了什么,但大部分都遵循了这里的指导:https://coderwall.com/p/e5fxrw
我已将必需的实体管理器Hibernate jar安装到my / 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>
现在我得到的第一个例外是&#34; java.lang.IllegalArgumentException:不是实体:...&#34;但是我的类都使用@Entity注释,并且在EclipseLink下工作。我不认为我应该用exclude-unlisted-classes = false列出我的类,并且真的想避免这种情况。
编辑:根据unwichtich的建议,我尝试添加:
<property name="hibernate.archive.autodetection" value="class, hbm"/>
并在persistence.xml中单独指定PU中的类,但没有任何改进。
感谢您的帮助。
答案 0 :(得分:1)
问题似乎是Hibernate 4.3.6+版本中的一个错误。我遇到了同样的问题(打破了一整天后),我试图改变Hibernate的版本(使用4.3.7)。经过一些测试后,我注意到4.3.5版本运行顺利。正如您使用EclipseLink提出的那样也没有任何问题。
我试图分析Hibernate源代码,但我找不到问题。无论如何,即使它不是永久解决方案,也可以是一种解决方法。在我的例子中,我将项目更改为使用Hibernate 4.3.5。
我希望你喜欢。
答案 1 :(得分:0)
你是对的,这适用于你的设置。
但是,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>
别忘了清洁&amp; amp;在重新部署项目之前构建项目。
另见: