2013-04-03 125 views
5

我在上面使用代碼來生成ID:@SequenceGenerator與allocationSize> 1產生重複的主鍵

@Id 
@GeneratedValue(generator = "seqq") 
@SequenceGenerator(name = "seqq", sequenceName = "seqq", allocationSize = 20, initialValue = 1) 
public long getId() { 
    return id; 
} 

我也更新的persistence.xml:

<property name="hibernate.id.new_generator_mappings" value="true"/> 

和更新DDL在數據庫:

CREATE SEQUENCE seqq 
    INCREMENT 20 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 9171 
    CACHE 1; 

感謝這個allocationSize = 20與增量值相同。但是,我得到任意的錯誤,說重複的鍵值違反了唯一約束「myobjects_pkey」。通常在首次保存試用後發生此錯誤。 看來,休眠試圖堅持實體具有相同的ID。但是,START確保該行高於表id中存在的任何行。 如何消除重複的約束錯誤?

回答

0

嘗試指定如下策略:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seqq") 

0

試試這個

/** The identity. */ 
    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @SequenceGenerator(name = "ID_SEQU_GENERATOR", sequenceName = "DB_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQU_GENERATOR") 
    public long getId() { 
     return id; 
    } 

DB_SEQ本應在DB as sequence定義。

0

設置hibernate.id.new_generator_mappings = true後,Hibernate將生成以LASTPRODUCEDID-ALLOCATIONSIZE開頭的id值。我經歷了默認的50 allocationSize如下:

使用新的發電機前:

entity.id   SEQ last number 
    48847     48847 
    48848     48848 
    48849     48849 
    48850     48850 

使用新的發電機後:

entity.id   SEQ last number 
    48801     48851 
    48802     48852 

所以,你必須增加與分配大小的順序。 由於序列的增加子句應該等於allocationSize,這意味着只需查詢nextval的序列。您可以使用以下腳本完成:

DECLARE 
    v NUMBER; 
    BEGIN 
    FOR r IN (select sequence_name from user_sequences) LOOP 
     EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v; 
    END LOOP; 
    END; 
/