簡體   English   中英

Hibernate PostgreSQL 自動生成的增量代碼字段有什么亂七八糟的?

[英]Hibernate PostgreSQL what a mess with auto generated increment code field?

Hibernate 在現有數據庫中為 jobLifeTime 實體創建了表,但它首先記錄自動生成的代碼,以 8781 開頭,而不是 0。該表具有指向其他對象(scraperTask)的外鍵,在 jobLifeTime 實體對象之前存儲在 DB 中,並且休眠給了一個代碼 8780 給 scraperTask 記錄(這很清楚,因為帶有 scraperTask 的表已經有一些記錄)。

為什么 hibernate 對來自 scraperTask.code 的 jobLifeTime.code 使用增量計數?

更新看起來像 Hibernate 或 PostgreSQL 對兩個表的主鍵使用一個數字序列。 這是正確的行為嗎?

這里是來自數據庫表的java類和屏幕截圖:

jobLifeTime 表 - 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
}

刮刀任務類

@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 在許多遠程表中復制)。 使用序列號緩存,不能保證不存在間隙或值嚴格按順序排列(例如,不同的數據庫連接可能緩存了不同的值,但您可能不知道每個插入使用哪個連接,因此不能保證嚴格遞增值)

您是否嘗試過截斷 jobLifeTime 表。 這個表還沒有記錄吧。

TRUNCATE TABLE jobLifeTime 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM