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
相关产品推荐
相关产品推荐

