我定义了一个带有序列生成主键的实体:
@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知道正确的下一个值,但它没有被使用。您有解决此问题的任何想法吗?
FYI:我知道此页面上说要使用GenerationType.AUTO,因为“Hibernate的人完全搞砸了”,但除此之外并没有什么不太有用的陈述。
hibernate.id.new_generator_mappings
,这样可以使一切变得更加清晰。 - Craig Ringer