You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate配置遇AbstractMethodError,Envers自动注册失效求助

问题描述

我正尝试通过hibernate.cfg.xml配置Hibernate连接PostgreSQL数据库,当前配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">postgres</property>
        <property name="hibernate.connection.url">jdbc:postgresql://127.0.0.1:5432/BlingBankDB</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL92Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="show_sql">true</property>
        <property name="hibernate.listeners.envers.autoRegister">false</property>
    </session-factory>
</hibernate-configuration>

数据库已能连接PostgreSQL集群,但出现如下错误:

Caused by: java.lang.AbstractMethodError: Receiver class org.hibernate.envers.internal.entities.RevisionTypeType does not define or inherit an implementation of the resolved method 'abstract int[] sqlTypes()' of interface org.hibernate.usertype.UserType.

完整堆栈信息:

! java.lang.ExceptionInInitializerError
    at pt.tecnico.sirs.databaseserver.repository.hibernate.HibernateUtil.buildSessionFactory (HibernateUtil.java:29)
    at pt.tecnico.sirs.databaseserver.repository.hibernate.HibernateUtil.<clinit> (HibernateUtil.java:10)
    at pt.tecnico.sirs.databaseserver.DatabaseServer.<init> (DatabaseServer.java:20)
    at pt.tecnico.sirs.databaseserver.DatabaseServer.main (DatabaseServer.java:63)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:254)
    at java.lang.Thread.run (Thread.java:840)
Caused by: java.lang.AbstractMethodError: Receiver class org.hibernate.envers.internal.entities.RevisionTypeType does not define or inherit an implementation of the resolved method 'abstract int[] sqlTypes()' of interface org.hibernate.usertype.UserType.
    at org.hibernate.type.CustomType.<init> (CustomType.java:58)
    at org.hibernate.type.BasicTypeRegistry.register (BasicTypeRegistry.java:166)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$2.contributeType (MetadataBuildingProcess.java:356)
    at org.hibernate.envers.boot.internal.TypeContributorImpl.contribute (TypeContributorImpl.java:27)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes (MetadataBuildingProcess.java:391)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingProcess.java:132)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build (MetadataBuildingProcess.java:86)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build (MetadataBuilderImpl.java:479)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build (MetadataBuilderImpl.java:85)
    at pt.tecnico.sirs.databaseserver.repository.hibernate.HibernateUtil.buildSessionFactory (HibernateUtil.java:23)
    at pt.tecnico.sirs.databaseserver.repository.hibernate.HibernateUtil.<clinit> (HibernateUtil.java:10)
    at pt.tecnico.sirs.databaseserver.DatabaseServer.<init> (DatabaseServer.java:20)
    at pt.tecnico.sirs.databaseserver.DatabaseServer.main (DatabaseServer.java:63)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:254)
    at java.lang.Thread.run (Thread.java:840)

尽管我已显式设置hibernate.listeners.envers.autoRegister为false,但Envers集成似乎仍处于启用状态,请问我哪里操作出错了?


解决方案

1. 核心原因:版本不兼容

AbstractMethodError本质是类依赖的接口方法未实现,这里是因为你使用的Hibernate核心版本与Envers版本不匹配。Hibernate 5.x之后,UserType接口的sqlTypes()方法签名发生过变化,旧版本Envers未适配该变化,导致运行时出错。同时hibernate.listeners.envers.autoRegister仅控制监听器自动注册,无法阻止Envers的类型贡献者组件加载,所以即使设置为false,Envers仍会被初始化。

2. 具体解决步骤

步骤1:统一Hibernate与Envers版本

检查项目依赖,确保Hibernate Core和Hibernate Envers的版本完全一致。比如使用Hibernate 5.6.x时,Envers也必须是5.6.x版本。

步骤2:彻底禁用Envers(若不需要该功能)

  • 移除依赖:从项目依赖中删除hibernate-envers相关包(比如Maven中删除对应的<dependency>节点),这是最彻底的方式。
  • 保留依赖时添加配置:若无法移除依赖,在配置文件中添加全局禁用参数:
    <property name="hibernate.integration.envers.enabled">false</property>
    
    这个参数才是真正全局关闭Envers集成的配置项。

步骤3:检查HibernateUtil代码

查看HibernateUtil中是否显式注册了Envers组件,比如是否存在metadataBuilder.applyIntegrator(new EnversIntegrator())这类代码,若有则移除。

3. 验证修改

重启项目,确认堆栈信息中不再出现Envers相关的初始化错误,数据库连接正常即可。

内容的提问来源于stack exchange,提问作者alexfaisca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:07:20