我有一个用序列生成的主键定义的实体:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_key_gen") @SequenceGenerator(name = "id_key_gen", sequenceName = "id_key_seq") @Column(name = "id", unique = true, nullable = false) public int getId() { return this.id; }
我正在使用PostgreSQL,并且此密钥定义为序列号。根据PostgreSQL
select last_value from id_key_seq;
退货
1603.
当我执行create()来持久化此实体的实例时,我在日志中看到以下内容(不相关的内容已被删除):
05 15:15:26.948 org.hibernate.id.enhanced.SequenceStructure [DEBUG]-获得的序列值:1604
05 15:15:26.948 org.hibernate.event.def.AbstractSaveEventListener [DEBUG]-使用策略:org.hibernate.id.enhanced.SequenceStyleGenerator生成的标识符:1554
后续的SQL插入语句引用值1554,而不是它 应 使用的值1604(基于SequenceStructure返回的值。Hibernate从何处获取1554?
在我看来,Hibernate在这里有一个错误-SequenceStructure知道正确的下一个值,但未在使用它。任何想法如何解决这个问题?
仅供参考:我知道此页面,它说要使用GenerationType.AUTO,因为“hibernate的人完全把它搞砸了”,但是除了这个非常无用的陈述外,没有什么其他的。
看起来如果您使用GenerationType.SEQUENCE,则需要将“增量值”指定为1,以避免将序列用作高/低种子。
您发布的问题的第一个答案(有用的答案)说明您需要在@GeneratedValue批注中指定“ allocationSize = 1”。
在较新的Hibernate版本中,您可以改为hibernate.id.new_generator_mappings=true在Hibernate属性中进行设置。请参阅文档。
hibernate.id.new_generator_mappings=true