@GeneratedValue mit Strategie = GenerationType.AUTO generiert nach dem Neustart einen wiederholten Wert

8

Ich habe eine Hibernate-Entität mit einer ID, die als

konfiguriert ist %Vor%

Die Erstellung neuer Elemente funktioniert im ersten Durchlauf einwandfrei. Aber wenn ich meine Anwendung neu starte und die Datensätze zurückgehe, versucht Hibernate beim nächsten Versuch, diese Entität beizubehalten, die gleiche ID zu verwenden, die erzeugt wurde, als die Anwendung nicht neu gestartet wurde.

Ich erhalte den Fehler unten, und wenn ich mit der Trace-Option lief, konnte ich sehen, dass die ID wiederverwendet wurde

  

* Hibernate: Einfügen in org_myEntity (entityJID, entityName, id) -Werte (?,?,?) org.hibernate.util.JDBCExceptionReporter
  SQL-Fehler: 20000, SQLState: 23505   org.hibernate.util.JDBCExceptionReporter Der   Anweisung wurde abgebrochen, da dies zu einem doppelten Schlüssel geführt hätte   Wert in einer eindeutigen oder primären Schlüsseleinschränkung oder eindeutigen Index identifiziert   von 'SQL120725164357680' definiert auf 'TABLE_NAME'.   org.hibernate.event.def.AbstractFlushingEventListener
  Der Datenbankstatus konnte nicht mit der Sitzung synchronisiert werden   org.hibernate.exception.ConstraintViolationException: konnte nicht *

Übrigens verwende ich Hibernate 3.3.2.GA, javax.persistance 2.0.0 und Derby 10.5.1 Datenbank

Hat jemand eine Idee, was an meiner Generation falsch sein könnte und wie könnte ich es beheben?

    
Thomas 25.07.2012, 15:39
quelle

1 Antwort

11

Wenn Sie AUTO verwenden, wählt Hibernate eine der Strategien aus, um Ihre ID zu generieren. Aus der Referenz:

  

AUTO - entweder Identität Spalte, Sequenz oder Tabelle abhängig von der   zugrunde liegenden DB.

Sie müssen also sehen, dass die IDs generiert werden, um zu sehen, welche Strategie Derby verwendet. Obwohl es so aussieht, wird der Generator jedes Mal zurückgesetzt, wenn Sie Ihre App neu starten. Versuchen Sie es mit

%Vor%

Sie könnten es aber schnell mit einem Sequenzgenerator beheben. Wie:

%Vor%

Dabei ist ENTITY_SEQ der Name der Sequenz in Ihrer Datenbank (Sie erstellen eine manuell).

    
Tiago Farias 25.07.2012, 17:04
quelle