Java 将@SequenceGenerator替换为@GenericGenerator
(Hibernate 5、PostgreSQL 9.6、Java 8、Spring ORM 4.3.6) 以下实体类别Java 将@SequenceGenerator替换为@GenericGenerator,java,spring,postgresql,hibernate,Java,Spring,Postgresql,Hibernate,(Hibernate 5、PostgreSQL 9.6、Java 8、Spring ORM 4.3.6) 以下实体类别Car工作正常: import javax.persistence.*; @Entity @SequenceGenerator(name = "carSequence", sequenceName = "car_id_seq", ) @Table(name = "car") public class Car { @Id @GeneratedValue(stra
Car
工作正常:
import javax.persistence.*;
@Entity
@SequenceGenerator(name = "carSequence", sequenceName = "car_id_seq", )
@Table(name = "car")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "carSequence")
private Long id;
//...
}
它基于以下SQL(简化):
然而,我得到了我想要解决的警告:
WARN org.hibernate.orm.deprecation: HHH90000014: Found use of deprecated [org.hibernate.id.SequenceHiLoGenerator] sequence-based id generator; use org.hibernate.id.enhanced.SequenceStyleGenerator instead. See Hibernate Domain Model Mapping Guide for details.
因此,我将旧车更换为:
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
@GenericGenerator(
name = "carSequence",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = "sequence_name", value = "car_id_seq"),
@org.hibernate.annotations.Parameter(name = "initial_value", value = "1"),
@org.hibernate.annotations.Parameter(name = "increment_size", value = "50")
}
)
@Table(name = "car")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "carSequence")
private Long id;
//...
}
但是,我的代码中出现了错误:
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_car"
Detail: Key (id)=(-34) already exists.
奇怪的事情:-34
看起来很奇怪。另一件奇怪的事情:序列生成重复的键 在id=709之前,车辆表已经填写完毕。
在序列定义中,
curval=15、nextval=16和increment=1
您没有指定要使用的优化器
在第一个变体中,您使用的是SequenceHilgenerator,在第二个变体中,您只指定增量大小,而不将优化器设置为HiLo
根据docs()的说明,如果未指定,Hibernate将选择生成器本身。由于增量大小大于1(),Hibernate可能会选择池式lo优化器,其操作方式与seqHiLo不同
所以,你应该加上
@Parameter(name = "optimizer", value = "hilo"),
要将优化器显式地设置为seqhilo我清除了表并将序列重置为1。同样,它在id:
-47
处添加了一条记录。为什么?我试试看
@Parameter(name = "optimizer", value = "hilo"),