2013-10-25 474 views
1

我與甲骨文序列和Hibernate的一個問題。我用這個代碼來獲得甲骨文序列與HibernateHibernate和甲骨文序列

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq") 
@SequenceGenerator(name = "student_id_seq", sequenceName = "Student_seq") 
@Column(name = "StudentID") 
public Long getStudentId() { 
    return this.studentId; 
} 

public void setStudentId(Long studentId) { 
    this.studentId = studentId; 
} 

,但是當我插入一個新值表,生成的值不正確。例如: 當我有數據庫中的兩個記錄與ID 2和3,當我插入新的,它的ID不是4但25。我不知道如何處理它。

+0

使用 '戰略= GenerationType.AUTO' 而不是 '戰略= GenerationType.SEQUENCE'。 – Rajesh

+0

爲什麼要那樣做? (順便說一句,我已經嘗試過,但沒有運氣) – ismail

回答

4

您應該設置allocationSize1

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq") 
@SequenceGenerator(name = "student_id_seq", 
        sequenceName = "Student_seq", 
        allocationSize = 1) 

你可以閱讀更多的文檔SequenceGenerator doc

2

當我看到你的問題,我想知道:你真的需要擁有id 4而不是25,還是僅僅是技術主鍵? 緩存問題的背後,如果你從你的序列問的值(ID = 4),然後回滾您的交易,下一次你會問一些你將有一個缺口(ID = 5),任何休眠或背後與緩存相關的問題。

正如普熱的第二個鏈接指出,Sequence gaps - Oracle: 「你永遠不應該產生任何東西,甚至接近數字的無間隙序列的順序計數他們是一個高速,高度可擴展的多用戶的方式來產生代理鍵。一張桌子。「

如果,據我所知,沒有必要在你的應用程序連續值時,很好地回答了「什麼用它做」的問題是:什麼都沒有,只是這些差距生活。

+0

是的:有辦法如何保證Oracle級別上的連續ID(帶序列)。它*僅*限制是:「它根本不會擴展」。一筆交易必須等待另一筆交易完成。 – ibre5041