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

Hibernate 6.2.2中如何在自定义IdentifierGenerator中使用默认生成策略?

Hibernate 6 自定义ID生成器兼容修改方案

在Hibernate 5中,我们可以通过继承IdentityGenerator实现自定义ID生成逻辑:当实体ID为0时使用默认生成策略,否则直接使用传入的ID,代码如下:

class UseIdOrGenerate : IdentityGenerator() {
    override fun generate(session: SharedSessionContractImplementor, obj: Any?): Any {
        val id = session.getEntityPersister(null, obj).getIdentifier(obj, session) as Int
        return if (id == 0) super.generate(session, obj) else id
    }
}

但Hibernate 6中IdentifierGenerator从抽象类改为接口,generate()成为接口方法,原代码里的super.generate(session, obj)会触发编译器错误"Abstract member cannot be accessed directly"——因为接口没有可继承的默认实现逻辑。

修改方案

直接实例化原默认生成器类(比如你之前依赖的IdentityGenerator),在需要使用默认策略时调用它的generate方法即可:

class UseIdOrGenerate : IdentifierGenerator {
    // 初始化默认的Identity生成器实例
    private val defaultIdentityGenerator = IdentityGenerator()

    override fun generate(session: SharedSessionContractImplementor, obj: Any?): Any {
        val id = session.getEntityPersister(null, obj).getIdentifier(obj, session) as Int
        return if (id == 0) defaultIdentityGenerator.generate(session, obj) else id
    }
}

如果你的默认ID生成策略不是Identity,只需将IdentityGenerator替换为对应生成器类(比如SequenceStyleGenerator)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:22:21