我有一个用序列生成的主键定义的实体:
@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] - 生成标识符:1554,使用策略:org.hibernate.id.enhanced.SequenceStyleGenerator
随后的 SQL 插入语句引用值 1554,而不是它应该使用的值,1604(基于从 SequenceStructure 返回的值。Hibernate 从哪里得到 1554?
在我看来,Hibernate 在这里有一个错误 - SequenceStructure 知道正确的下一个值,但它没有被使用。知道如何解决这个问题吗?
仅供参考:我知道这个页面,它说要使用 GenerationType.AUTO,因为“Hibernate 的人完全搞砸了”,但除了那个不太有用的声明之外,没有太多。