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

时间:2016-09-14 12:46:29

标签: hibernate

在我们当前的产品(使用Spring boot-4.2.4和hibernate-5.1)中,我们打算让Id Generators的选择更加灵活。
这是在实体级别,我们不想映射任何特定的生成器(如身份,表或序列)。我们要提到的是这个实体是否会成为批量插入的一部分 然后在基于db方言和用户配置值的运行时,我们将映射一个适当的生成器 我曾尝试过以下选项:
选项1:(在@GenericGenerator中指定自定义委托者生成器)
在自定义生成器实例化期间,基于运行时配置,我们可以设置委托者(Identity,Table或Sequence),然后委托对它的所有调用。

    //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,PersistentIdentifierGenerator等接口。
自定义生成器无法实现所有这些接口,因为底层委托者可能不支持这些操作。另一方面,如果自定义生成器没有实现任何这些,我们可能会松开hibernate优化 选项2:(使用IdGeneratorStrategyInterpreter)
我可以有一个IdGeneratorStrategyInterpreter的自定义实现,它将根据检查的条件返回相应的生成器类型。但不知道如何让hibernate通过Spring了解这种配置 选项3:(为每个实体覆盖生成器)
如果我们可以在构建每个实体的元数据时从hibernate获取一个钩子,我们可以覆盖生成器。如果这不应该花费太多时间 非常感谢你对此的帮助。

0 个答案:

没有答案