Java Hibernate PostgreSQL自动生成的增量代码字段有多混乱?

Java Hibernate PostgreSQL自动生成的增量代码字段有多混乱?,java,hibernate,postgresql,Java,Hibernate,Postgresql,Hibernate在现有数据库中为jobLifeTime实体创建了表,但它将自动生成的第一条记录代码从8781开始,而不是0。此表具有另一个对象(scraperTask)的外键,该对象存储在jobLifeTime实体对象之前的DB中,并且hibernate为scraperTask记录提供了代码8780(此清除是因为具有scraperTask的表已经有一些记录) 为什么hibernate使用scraperTask.code中的jobLifeTime.code的增量计数 更新 看起来Hibernat

Hibernate在现有数据库中为jobLifeTime实体创建了表,但它将自动生成的第一条记录代码从8781开始,而不是0。此表具有另一个对象(scraperTask)的外键,该对象存储在jobLifeTime实体对象之前的DB中,并且hibernate为scraperTask记录提供了代码8780(此清除是因为具有scraperTask的表已经有一些记录)

为什么hibernate使用scraperTask.code中的jobLifeTime.code的增量计数

更新 看起来Hibernate或PostgreSQL对两个表主键都使用一个数字序列。这是正确的行为吗

下面是数据库表中的java类和屏幕截图:

scraperTask类

@Entity
@Table(indexes = { @Index(name = "scraper_task_code_hidx", columnList = "code"),
        @Index(name = "task_start_at_hidx", columnList = "task_start_at")})
public class ScraperTask {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long code;
    @Column(name="task_start_at")
    private Date taskStartAt;
    private Date taskCompleteAt;
    private String description;
    @Transient
    private Integer salaryMin;
    @Transient
    private Integer salaryMax;
    //@Transient
    private Integer websiteJobsNumber;
    @Transient
    private String firstResponse;
    //@Transient
    //private Integer processedNodes;
    //@Transient
    private Boolean doneSuccessfully;
    @Transient
    private List<JobLifeTime> scrapedJobLifeTimeList;
    @Transient
    private List<Job> scrapedJobList;
    @Transient
    private KeywordsEntity keywordsEntity;
    @Transient
    private String category;

    protected ScraperTask(){
    }

    public ScraperTask(String uriString, Integer salaryMin, Integer salaryMax){
        description = uriString;
        taskStartAt = new Date();
        this.salaryMin = salaryMin;
        this.salaryMax = salaryMax;
        websiteJobsNumber=0;
        //processedNodes = 0;
        doneSuccessfully = false;
        scrapedJobLifeTimeList = new LinkedList<JobLifeTime>();
        scrapedJobList = new LinkedList<Job>();
    }
//getters-setters
}
@实体
@表(Index={@Index(name=“scraper\u task\u code\u hidx”,columnList=“code”),
@索引(name=“task\u start\u at\u hidx”,columnList=“task\u start\u at”)})
公共类刮板任务{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有长码;
@列(name=“task\u start\u at”)
私人约会;
私人约会任务完成;
私有字符串描述;
@短暂的
私有整数salaryMin;
@短暂的
私有整数salaryMax;
//@短暂的
私有整数网站jobsnumber;
@短暂的
私有字符串响应;
//@短暂的
//私有整数处理节点;
//@短暂的
私有布尔运算成功;
@短暂的
私人列表和私人时间列表;
@短暂的
私人名单义务人;
@短暂的
私密关键词感知关键词感知;
@短暂的
私有字符串类别;
受保护的ScraperTask(){
}
公共ScraperTask(字符串URI字符串、整数salaryMin、整数salaryMax){
description=uriString;
taskStartAt=新日期();
this.salaryMin=salaryMin;
this.salaryMax=salaryMax;
网站JobsNumber=0;
//processedNodes=0;
donesuccesfully=false;
scrapedJobLifeTimeList=newlinkedlist();
scrapedJobList=新链接列表();
}
//吸气剂二传手
}

您是否尝试截断jobLifeTime表。这个表还没有正确的记录

TRUNCATE TABLE jobLifeTime 

如果希望控制生成的值,请使用Postgresql序列对象并在实体对象中正确声明它


也就是说,内部自动生成的主键不应该关心值是什么,因为在大多数情况下,它们不应该暴露在应用程序之外,而应该仅用于外键(即,而不是在许多远程表中复制多部分PK)。使用序列号缓存,无法保证间隙不存在或值严格按顺序排列(例如,不同的数据库连接可能缓存了不同的值,但您可能不知道每个插入使用哪个连接,因此不能保证值严格递增)

您能解释原因吗?我可以删除表,从表中删除,截断。。。除了不能理解它如何解决代码增量混乱的问题之外,还有什么别的东西吗?hibernate创建表并开始填充数据时该表不存在确定,请尝试更改:strategy=GenerationType.IDENTITY.use GenerationType.IDENTITY with postgres
TRUNCATE TABLE jobLifeTime