2013-04-03 8 views
5

ich über Code bin mit ID zu generieren:@SequenceGenerator mit allocationSize> 1 erzeugt doppelte Primärschlüssel

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

ich auch aktualisiert persistence.xml:

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

und aktualisiert ddl in der Datenbank:

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

Dank dieser allocationSize = 20 ist das gleiche wie Inkrementwert. Ich erhalte jedoch willkürliche Fehler, wenn der doppelte Schlüsselwert die eindeutige Einschränkung "myobjects_pkey" verletzt. Oft tritt dieser Fehler nach dem ersten Versuch auf. Es scheint, dass Hibernate versucht, Entität mit derselben ID zu erhalten. START stellt jedoch sicher, dass die Zeile höher ist als die in der Tabellen-ID vorhandene Zeile. Wie doppelte Constraint-Fehler zu beseitigen?

Antwort

0

versuchen, die Strategie, wie unten festgelegt wird:

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

0

diese

/** 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 Versuchen Sie dies in DB as sequence definiert werden sollte.

0

Nach dem Festlegen von hibernate.id.new_generator_mappings = true erzeugt Hibernate ID-Werte, die mit LASTPRODUCEDID-ALLOCATIONSIZE beginnen. Ich erlebte die folgenden mit dem Standard-50 allocationSize:

Bevor neue Generator:

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

Nach der Verwendung von neuen Generator:

entity.id   SEQ last number 
    48801     48851 
    48802     48852 

So haben Sie Ihre Sequenz mit Zuordnungsgröße zu erhöhen. Da die Erhöhung der Klausel Ihrer Sequenz gleich sein sollte, bedeutet dies, dass Sie einfach die nextval Ihrer Sequenzen abfragen. Sie können es mit dem folgenden Skript tun:

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; 
/
Verwandte Themen