Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将@SequenceGenerator替换为@GenericGenerator_Java_Spring_Postgresql_Hibernate - Fatal编程技术网

Java 将@SequenceGenerator替换为@GenericGenerator

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

(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(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"),