JBoss as7 到 WildFly 的 Hibernate 迁移

Posted

技术标签:

【中文标题】JBoss as7 到 WildFly 的 Hibernate 迁移【英文标题】:JBoss as7 to WildFly migration with Hibernate 【发布时间】:2015-03-17 07:14:35 【问题描述】:

我尝试从 JBoss AS 7 迁移到 Wildfly 8.2。而且我在休眠方面确实有问题。

我正在使用带有依赖项的 maven:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>4.2.0.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.0-api</artifactId>
  <version>1.0.1.Final</version>
</dependency>

当我在 AS 7 中启动我的应用程序时,我在 wildfly 中遇到错误:

10:08:11,485 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 53) MSC000001: Failed to start service jboss.persistenceunit."com.haslerrail.MyDatabase.web.war#MyDatabase": org.jboss.msc.service.StartException in service jboss.persistenceunit."com.haslerrail.MyDatabase.web.war#MyDatabase": javax.persistence.PersistenceException: [PersistenceUnit: MyDatabase] Unable to build Hibernate SessionFactory
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:172) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
      at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.7.0_65]
      at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:474)
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_65]
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_65]
      at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_65]
      at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: MyDatabase] Unable to build Hibernate SessionFactory
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1239) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:120) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:855) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) [jipijapa-hibernate4-3-1.0.1.Final.jar:]
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
      ... 8 more
Caused by: org.hibernate.AnnotationException: Attribute [com.haslerrail.MyDatabase.server.db.entity.Widget.type] was annotated as enumerated, but its java type is not an enum [java.lang.String]
      at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:257) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:195) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:216) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2241) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) [hibernate-core-4.3.7.Final.jar:4.3.7.Final]
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]
      ... 13 more

我试图找到任何有关 hibernate 和 wildfly 的文档,但 https://docs.jboss.org/author/display/WFLY8/Hibernate 上的文档是空的!!!!

有人有从 AS 7 迁移到 Wildfly 和 hibernate 的经验吗?我需要调整什么?

【问题讨论】:

您已经在应用程序中部署了 API 依赖项。您应该将您的休眠依赖项标记为已提供,JBoss 提供了它们。永远不要在您的应用程序中部署 JPA 等 API,它们仅用于编译目的。 好的,谢谢。我将依赖项更改为提供但错误仍然相同...! @Gimby .. 这不是真的。如果我们想使用 Jboss 中提供的库版本以外的库版本怎么办? @Rohit 然后您部署另一个-implementation-(例如EclipseLink,甚至是更新版本的Hibernate),但您仍然从未部署-api-(JPA)。大多数人似乎不明白其中的区别。 @Gimpy... 要部署较新(或所需)的版本,将其标记为已提供将无济于事。 【参考方案1】:

Hibernate 的容器版本优先于 Java EE 容器中的应用程序打包版本。因此出现错误。

为避免这种情况,您需要显式控制类加载并排除容器库。阅读here

基本上,您需要提供jboss-deployment-structure.xml 以对依赖项进行细粒度控制。

例如:

    <jboss-deployment-structure>
        <deployment>
            <exclusions>
                <!-- Exclude container version of hibernate. By default its version 4, we want 
                    bundled version to load -->
                <module name="org.hibernate" slot="main" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>

【讨论】:

好的,你有 jboss-deployment-structure.xml 文件的运行示例吗?在我的 jboss-deployment-structure.xml 文件中添加您的行后,我不再收到错误消息,但出现一些错误,例如 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy" ) failed - address: ([("deployment" => "xxxx.war")]) 这是什么意思? 恐怕没有一种适合所有情况的 jboss-deployment-structure.xml 结构。您可能需要查看个别错误消息以确定哪些库导致问题。 我简直不敢相信,我是第一个使用 wildfly 和 hibernate 的人。但是绝对没有有用的文档或任何示例可供查找。很郁闷…… 您分享的那行表明部署失败,日志中的某处应该有堆栈跟踪,可以准确地说明失败的原因。我会假设它现在与其他一些库有关,因为它已经处理了休眠。我建议如果它与其他一些图书馆相关,请将其标记为答案并打开一个单独的问题,因为这个问题将来可能会帮助其他用户。 再次,根本原因是什么?【参考方案2】:

经过几个小时的尝试,这个版本的 jboss-deployment-structure.xml 文件似乎对我有用:

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.hibernate" slot="main" />
    </exclusions>
    <dependencies>
      <module name="org.hibernate" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

我认为我还需要“org.hibernate”作为依赖项,因为我正在使用 Flyway 进行数据库迁移......否则我会收到一些错误消息。

没有 Flyway,Rohit 的答案似乎是正确的......(但我还没有测试过!)

【讨论】:

我知道这是一个旧线程,但只是好奇,您的解决方案是否使用 hibernate 4.2.0 Final 而不是 wildfly 8.2 提供的 4.3.7 Final?你是如何确保它使用你的hibenate(在这种情况下是4.2.0 final)

以上是关于JBoss as7 到 WildFly 的 Hibernate 迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Jenkins 将我的项目部署到 JBoss EAP(AS7)

jboss-as-maven-plugin 无法部署到远程 JBoss AS7?

JBoss AS7部署插件(jboss-as-maven-plugin)

JBoss AS7中进行项目部署

Jboss AS7 无法正常关闭

使用带有 JBoss AS7 的 SSL 中断连接(Richfaces 页面)