在我们当前的产品(使用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获取一个钩子,我们可以覆盖生成器。如果这不应该花费太多时间
非常感谢你对此的帮助。