2016-04-28 7 views
1

HibernateはjobLifeTimeエンティティの既存のデータベースにテーブルを作成しましたが、0ではなく8781で始まる自動生成コードを最初に記録しました。このテーブルには、jobLifeTimeエンティティの前にDBに格納されている他のオブジェクト(scraperTask) scraperTaskレコードにコード8780が与えられています(これはscraperTaskのテーブルにはすでにレコードがいくつかあるためです)。Hibernate PostgreSQL自動インクリメントコードフィールドで何が混乱するのですか?

なぜhibernateがscraperTask.codeからjobLifeTime.codeのインクリメントカウントを使用するのですか?休止状態またはPostgreSQLは両方のテーブルの主キーの1つの数列を使用するように

更新 が見えます。これは正しい行動ですか?データベーステーブルから

ここでは、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 
} 
+0

使用GenerationType.IDENTITY with postgres –

答えて

1

生成された値を制御したい場合は、Postgresqlシーケンスオブジェクトを使用し、エンティティオブジェクトで正しく宣言します。

これは、内部で自動生成される主キーは、大部分がアプリケーションの外部に公開されるべきではなく、単純に外部キーにのみ使用されるべきである(つまり、多くのリモートテーブルに複製されたマルチパートPKを持つこと)。順序番号キャッシングを使用すると、ギャップが存在しないことや値が厳密に順序付けられているという保証はありません(たとえば、異なるデータベース接続によって異なる値がキャッシュされる可能性がありますが、厳密に値を増やす)

0

あなたはjobLifeTimeテーブルを切り捨てることを試みました。この表にはまだレコードはありません。

TRUNCATE TABLE jobLifeTime 
+0

理由を説明できますか?私はテーブルを削除することができます、テーブルから削除、切り捨て...何かが、コードのインクリメントの問題を解決する方法を理解できません?休止状態にしてデータを作成してからデータを入力し始めると、テーブルが存在しませんでした。 – Pavlo

+0

Ok:変更を試みてください:strategy = GenerationType.IDENTITY。 –

関連する問題