2015-12-02 101 views
3

我正在從3遷移到休眠5.我看到序列發生器在Hibernate 5中不能正常工作。我用最小值1000定義序列,並且遞增1.但是當我嘗試創建一個新的實體記錄,我看到一個插入ID爲951的記錄。似乎這個ID是從實際序列下一個值中減去50。在我的情況下,ID應該是1000.休眠5序列生成問題

請讓我知道任何幫助。

這裏是我的實體和程序:

實體:

@Entity 
@Table(name = "SOME TABLE") 
public class Group { 

    @Id 
    @Column(name = "id") 
    @SequenceGenerator(name = "name", sequenceName ="SEQ_name") 
    @GeneratedValue(strategy = GenerationType.AUTO, generator="name") 
    private Long id; 

    @Pattern(regexp = "^[^\\*]*$", message = "{3011}") 
    @Size(message = "{3014}") 
    @NotBlank(message = "{3000}") 
    @Column(name = NAME, unique = true, nullable = false) 
    private String name; 

順序:

CREATE SEQUENCE SEQ_name MINVALUE 1000 NOMAXVALUE INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE; 

回答

0

您定義不符合1000開始,但該序列以1(MINVALUE 1) 。我也沒有看到你將所提到的序列設置爲你的實體使用的序列。

+0

它的一個發佈錯誤。更新與實際 – Sydubabu

+0

@Steve Ebersole任何幫助。 – Sydubabu

5

休眠呼叫SEQ_name.nextval但如果allocationSize大於1,它由allocationSize遞減它和由1

下(allocationSize-1)密鑰生成遞增它而不通信完成與數據庫通過簡單1。

增加其結果是,如果你使用默認allocationSize是50,有兩種後果:

序列必須有INCREMENT BY設置爲相同的值allocationSize

要對齊與數據庫中已有的鍵的順序,設置START WITH

最大值(ID)+ allocationSize

這裏的一個小例子

-- START WITH = max(ID) + allocation size 
-- INCREMENT BY = allocation size 
-- e.g. if 100 is the last key, 
-- to start with a key 101 - set START WITH to 150 
CREATE SEQUENCE hib_seq START WITH 150 INCREMENT BY 50; 



select hib_seq.nextval - 50 + 1 from dual; 
101 
-- 49 times Hibernate performs increase by 1 - keys 102 to 150 
-- new sequence generation 
select hib_seq.nextval - 50 + 1 from dual; 
151 
+0

我不認爲序列高速緩存的問題,因爲在我的情況下,在數據庫級別的高速緩存只有20但我得到951而不是1000.如果它是20不同,我懷疑緩存的問題。但這裏的差異是50這是一個默認** allocationSize **值 – Sydubabu

+0

@Sydubabu我明白了 - [this](http://stackoverflow.com/questions/5346147/hibernate-oracle-sequence-produces-large-gap )可能會對你有趣... –