我正在使用上面的代码生成id:
@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”。通常在首次保存试用后会发生此错误。 看来hibernate试图用相同的Id来持久化实体。但是,START确保该行高于表id中的任何行。 如何消除重复约束错误?
答案 0 :(得分:0)
尝试指定策略如下:
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seqq")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seqq")
答案 1 :(得分: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
中定义。
答案 2 :(得分: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
所以你必须用分配大小增加你的序列。 由于序列的增加by子句应该等于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;
/