Hibernate:ID生成器的灵活配置(标识、顺序或表)

Hibernate:ID生成器的灵活配置(标识、顺序或表),hibernate,Hibernate,在我们当前的产品(使用Spring boot-4.2.4和hibernate-5.1)中,我们打算使Id生成器的选择更加灵活。 这是在实体级别,我们不希望映射任何特定的生成器(如标识、表或序列)。我们要提到的是,该实体是否将成为批量插入的一部分。 然后在运行时,根据db方言和用户配置的值,我们将映射一个适当的生成器。 我尝试了以下选项: 选项1:(在@GenericGenerator中指定自定义委托人生成器) 在自定义生成器实例化期间,根据运行时配置,我们可以设置delegator(标识、表或序

在我们当前的产品(使用Spring boot-4.2.4和hibernate-5.1)中,我们打算使Id生成器的选择更加灵活。
这是在实体级别,我们不希望映射任何特定的生成器(如标识、表或序列)。我们要提到的是,该实体是否将成为批量插入的一部分。
然后在运行时,根据db方言和用户配置的值,我们将映射一个适当的生成器。
我尝试了以下选项:
选项1:(在@GenericGenerator中指定自定义委托人生成器)
在自定义生成器实例化期间,根据运行时配置,我们可以设置delegator(标识、表或序列),然后将所有调用委托给它

    //Entity Class
    @Id
    @GeneratedValue(generator="generic")
    @GenericGenerator(name="generic", strategy = "src.test.CustomGenerator")
    public Long getId() {
    return id;
    }


// Custom Generator
public class CustomGenerator implements IdentifierGenerator {

    IdentifierGenerator delegator;

    public CustomGenerator() {
        if (true) //Condition based on config, dialect etc
            delegator = new IdentityGenerator();
        else
            delegator = new SequenceStyleGenerator();

    }

    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        return delegator.generate(session, object);
    }
}
此选项的问题是,只有部分生成器将实现PostInsertIdentifierGenerator、PersistentiIdentifierGenerator等接口。
自定义生成器无法实现所有这些接口,因为底层委托器可能不支持这些操作。另一方面,如果自定义生成器没有实现其中任何一项,我们可能会放弃hibernate优化。
选项2:(使用IdGeneratorStrategyInterpreter)
我可以有一个IdGeneratorStrategyInterpreter的自定义实现,它将根据检查的条件返回适当的生成器类型。但不确定如何通过Spring让hibernate知道此配置。
选项3:(覆盖每个实体的生成器)
如果我们可以在构建每个实体的元数据时从hibernate获得一个钩子,我们就可以覆盖生成器。前提是这不会花费太多时间。

非常感谢您的帮助。

您找到解决方案了吗?