gpt4 book ai didi

java - Hibernate PostgreSQL 自动生成的增量代码字段有什么乱七八糟的?

转载 作者:行者123 更新时间:2023-11-29 13:24:05 24 4
gpt4 key购买 nike

Hibernate 在现有数据库中为 jobLifeTime 实体创建了表,但它给第一个记录自动生成的代码以 8781 开头,而不是 0。这个表有其他对象(scraperTask)的外键,在 jobLifeTime 之前存储在数据库中实体对象,并 hibernate 给 scraperTask 记录一个代码 8780(这很清楚,因为带有 scraperTask 的表已经有一些记录)。

为什么 hibernate 使用来自 scraperTask.code 的 jobLifeTime.code 的增量计数?

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

这里是java类和数据库表的截图:

jobLifeTime table - job_chron_stg

@Entity
@Table(name="job_chron_stg", indexes = { @Index(name = "job_life_time_code_hidx", columnList = "code"),
@Index(name = "job_life_time_job_id_hidx", columnList = "job_id")})
public class JobLifeTime {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long code;
@Column(name="job_id", length=24)
private String targetJobCode;
@ManyToOne()
private ScraperTask scraperTask;
@Column(name="salary_low")
private Integer salaryMin;
@Column(name="salary_high")
private Integer salaryMax;
@Column(name="scrape_timestamp")
private Date scrapeTimestamp;
@Column(name="remove_timestamp")
private Date removeTimestamp;

public JobLifeTime(){}

public JobLifeTime(Element node, ScraperTask scraperTask){
targetJobCode = node.attr("data-jk");
this.scraperTask = scraperTask;
salaryMin = scraperTask.getSalaryMin();
salaryMax = scraperTask.getSalaryMax();
scrapeTimestamp = new Date();
}
//getters-setters
}

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
}

最佳答案

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

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

关于java - Hibernate PostgreSQL 自动生成的增量代码字段有什么乱七八糟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com