求助:WildFly27+Jakarta EE10配置PostgreSQL13数据源遇Hibernate6.0.2启动错误
问题背景
需在WildFly中配置PostgreSQL数据源,用于Jakarta EE 10项目配合Hibernate 6.0.2使用,但启动时出现服务初始化失败错误。
当前配置信息
WildFly中的PostgreSQL模块
<?xml version="1.0" ?> <resources> <resource-root path="postgresql-42.2.5.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies>
数据源配置
<datasource jndi-name="java:jboss/datasources/nextu" pool-name="nextu"> <connection-url>jdbc:postgresql://localhost:5432/nextu</connection-url> <driver>postgres</driver> <security> <user-name>nextu</user-name> <password>nextu</password> </security> </datasource>
使用的驱动类
org.postgresql.Driver
Persistence.xml配置
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd" version="3.1"> <persistence-unit name="primary"> <jta-data-source>java:jboss/datasources/nextu</jta-data-source> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <!-- AUTO-GENERATES DATABASE FROM ANNOTATIONS METADATA --> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> <property name="javax.persistence.schema-generation.create-source" value="metadata"/> <property name="javax.persistence.schema-generation.drop-source" value="metadata"/> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL95Dialect"/> </properties> </persistence-unit> </persistence>
启动错误信息
00:50:49,304 错误 [org.jboss.msc.service.fail] (ServerService线程池 -- 80) MSC000001:启动服务jboss.persistenceunit."servlet-0.0.1-SNAPSHOT.war#primary"失败:org.jboss.msc.service.StartException in service jboss.persistenceunit."servlet-0.0.1-SNAPSHOT.war#primary": java.lang.ExceptionInInitializerError
at org.jboss.as.jpa@27.0.0.Alpha5//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:199)
at org.jboss.as.jpa@27.0.0.Alpha5//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:129)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at org.wildfly.security.elytron-base@2.0.0.Beta3//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:664)
at org.jboss.as.jpa@27.0.0.Alpha5//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:214)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.ExceptionInInitializerError
at org.hibernate@6.0.2.Final//org.hibernate.dialect.PostgreSQLDialect.contributeTypes(PostgreSQLDialect.java:1107)
at org.hibernate@6.0.2.Final//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:374)
at org.hibernate@6.0.2.Final//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:144)
at org.hibernate@6.0.2.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1350)
at org.hibernate@6.0.2.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1421)
at org.hibernate.jipijapa-hibernate6@27.0.0.Alpha5//org.jboss.as.jpa.hibernate.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:45)
at org.jboss.as.jpa@27.0.0.Alpha5//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:171)
... 10 more
Caused by: java.lang.RuntimeException: Could not initialize PostgreSQLPGObjectJdbcType
at org.hibernate@6.0.2.Final//org.hibernate.dialect.PostgreSQLIntervalSecondJdbcType.(PostgreSQLIntervalSecondJdbcType.java:78)
... 17 more
Caused by: java.lang.NoSuchMethodException: org.postgresql.util.PGInterval.getWholeSeconds()
at java.base/java.lang.Class.getDeclaredMethod(Class.java:2675)
at org.hibernate@6.0.2.Final//org.hibernate.dialect.PostgreSQLIntervalSecondJdbcType.(PostgreSQLIntervalSecondJdbcType.java:74)
... 17 more
00:50:49,307 错误 [org.jboss.as.controller.management-operation] (Controller启动线程) WFLYCTL0013:操作("deploy")失败 - 地址:([("deployment" => "servlet-0.0.1-SNAPSHOT.war")]) - 失败描述:{"WFLYCTL0080: Failed services" => {"jboss.persistenceunit."servlet-0.0.1-SNAPSHOT.war#primary"" => "java.lang.ExceptionInInitializerError Caused by: java.lang.ExceptionInInitializerError Caused by: java.lang.RuntimeException: Could not initialize PostgreSQLPGObjectJdbcType Caused by: java.lang.NoSuchMethodException: org.postgresql.util.PGInterval.getWholeSeconds()"}}
00:50:49,360 信息 [org.jboss.as.server] (ServerService线程池 -- 46) WFLYSRV0010:已部署"servlet-0.0.1-SNAPSHOT.war" (运行时名称:"servlet-0.0.1-SNAPSHOT.war")
00:50:49,361 信息 [org.jboss.as.controller] (Controller启动线程) WFLYCTL0183:服务状态报告
WFLYCTL0186:启动失败的服务:
service jboss.persistenceunit."servlet-0.0.1-SNAPSHOT.war#primary": java.lang.ExceptionInInitializerError
WFLYCTL0448:另有11个服务因依赖缺失或失败而停止
00:50:49,408 信息 [org.jboss.as.server] (Controller启动线程) WFLYSRV0212:恢复服务器
00:50:49,410 错误 [org.jboss.as] (Controller启动线程) WFLYSRV0026:WildFly Preview 27.0.0.Alpha5 (WildFly Core 19.0.0.Beta15) 已启动(存在错误),耗时9738ms - 已启动658个服务中的412个(13个服务失败或依赖缺失,362个服务为懒加载、被动或按需启动) - 使用的服务器配置文件:standalone.xml
解决方案
核心问题
错误根源是PostgreSQL JDBC驱动版本过低:当前使用的postgresql-42.2.5.jar中,org.postgresql.util.PGInterval类未包含getWholeSeconds()方法,而Hibernate 6.0.2需要该方法处理时间间隔类型。
修复步骤
升级PostgreSQL JDBC驱动版本
- 下载适配Hibernate 6.0.2的PostgreSQL驱动,推荐使用42.3.0或更高版本(该版本起新增
getWholeSeconds()方法)。 - 替换WildFly模块中的旧驱动:将新的
postgresql-xxx.jar放入WildFly对应模块目录(如modules/system/layers/base/org/postgresql/main),并更新module.xml中的resource-root path为新Jar文件名。
- 下载适配Hibernate 6.0.2的PostgreSQL驱动,推荐使用42.3.0或更高版本(该版本起新增
更新Hibernate方言(可选但推荐)
Hibernate 6.0.2针对PostgreSQL提供了更新的方言,将persistence.xml中的方言配置替换为:<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>也可根据PostgreSQL版本选择更具体的方言,如
PostgreSQL10Dialect等。清理并重新部署
- 清理WildFly缓存目录(
standalone/tmp和standalone/data)。 - 重新部署应用,启动WildFly验证问题是否解决。
- 清理WildFly缓存目录(
内容的提问来源于stack exchange,提问作者Andre Kouame

