我有一个现有的数据库架构,我试图与Hibernate 4.1.6一起使用。我需要支持多个数据库版本,包括Oracle,所以我使用SequenceStyleGenerator进行id生成。我创建了一个与Oracle中的生成器一起使用的序列。
如果序列有一个现有值(比如2),那么我可以看到,当我在一个实体上调用save或update时,Hibernate会调用序列的nextval来获取下一个值并得到3,这是正确的。然后,出于某种原因(在Hibernate类OptimizerFactory中),Hibernate从序列值中减去1以获取要使用的id,由于唯一约束错误而失败 - 如果nextval为3,则已使用2。
为什么Hibernate从序列中减去1以获取用于id的值,以及如何让它按原样使用序列?
答案 0 :(得分:0)
我正在为SequenceStyleGenerator使用池化优化器,问题与此有关。 Hibernate文档说,当使用池化优化器时,我们只是将“下一组”的起始值存储到数据库结构中,而不是将序列值与内存中的分组算法相结合。所以我想当Hibernate读取nextval并得到3时,它会减去一个得到的currval,它用作下一组的起始值。
我将尝试对优化器使用“none”...并且还尝试找到一些文档来解释有关池化优化器的更多信息以及如果除了Hibernate以外的应用程序将使用相同的顺序。