2012-07-25 13 views
8

ich eine Hibernate-Einheit mit einer ID als@GeneratedValue mit Strategie = GenerationType.AUTO generiert Wert wiederholt nach dem Neustart

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

Die Schaffung neuer Elemente funktioniert ok im ersten Lauf konfiguriert haben. Aber wenn ich meine Anwendung neu starte und die Datensätze zurückgehe, versucht Hibernate beim nächsten Versuch, diese Entität zu persistieren, dieselbe ID zu verwenden, die erzeugt wurde, als die Anwendung nicht neu gestartet wurde.

Ich erhalte den Fehler unten, und wenn sie mit Trace-Option ausgeführt wird, konnte ich sehen, dass die ID

*Hibernate: insert into org_myEntity (entitiyJID, entitityName, id) values (?, ?, ?) org.hibernate.util.JDBCExceptionReporter
SQL Error: 20000, SQLState: 23505 org.hibernate.util.JDBCExceptionReporter The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL120725164357680' defined on 'TABLE_NAME'. org.hibernate.event.def.AbstractFlushingEventListener
Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not*

Durch die Art und Weise wiederverwendet wurde, ich bin mit 3.3.2.GA Hibernate, javax .persistance 2.0.0 und Derby 10.5.1 Datenbank

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

Antwort

11

Wenn Sie AUTO verwenden, wählt Hibernate eine der Strategien zum Generieren Ihrer ID aus. Aus der Referenz:

AUTO - either identity column, sequence or table depending on the underlying DB.

Sie müssen sehen, 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 die Einstellung

<prop key="hibernate.hbm2ddl.auto">update</prop> 

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

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

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

+1

Es war ein bisschen komplizierter, aber Ihre Bemerkung zum "hibernate.hbm2ddl.auto" beringte die Glocke. Ich hatte schließlich eine Projekteigenschaftendatei mit dem hibernate.hbm2ddl.auto gesetzt, um create-drop und die SessionFactory von einem der Bündel mit dem hibernate.hbm2ddl.auto zu bilden, um zu aktualisieren. Das führte dazu, dass meine Daten für dieses Paket in der Datenbank gespeichert wurden, die Iteratoren jedoch neu gestartet wurden. Obrigado pela dica = D – Thomas

Verwandte Themen