2012-07-25 9 views
8

Mam podmiot hibernacji z identyfikatorem skonfigurowany jako@GeneratedValue ze strategią = GenerationType.AUTO generuje wartość powtórzony po restarcie

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

Tworzenie nowych elementów działa OK w pierwszym biegu. Ale jeśli ponownie uruchomię aplikację i pobierze z powrotem rekordy, następnym razem, gdy spróbuję utrwalić tę encję, hibernate spróbuje użyć tego samego identyfikatora wygenerowanego, gdy aplikacja nie zostanie ponownie uruchomiona.

pojawia się błąd poniżej, a gdy uruchomiony z opcją śledzenia, byłem w stanie zobaczyć, że identyfikator został ponownego użycia

*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*

Nawiasem mówiąc, używam hibernacji 3.3.2.GA, javax .persistance 2.0.0 i baza danych Derby 10.5.1

Czy ktoś ma pojęcie, co może być nie tak w moim pokoleniu i jak mogę to naprawić?

Odpowiedz

11

W przypadku użycia opcji AUTO hibernacja wybierze jedną ze strategii generowania identyfikatora. Od numeru referencyjnego:

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

Musisz więc zobaczyć generowane identyfikatory, aby zobaczyć, której strategii używa Derby. Chociaż wygląda na to, resetuje generator za każdym razem, gdy ponownie uruchomisz aplikację. Spróbuj jednak ustawić

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

Możesz jednak szybko naprawić za pomocą generatora sekwencji. Na przykład:

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

Gdzie ENTITY_SEQ jest nazwą sekwencji w bazie danych (tworzy się ją ręcznie).

+1

To było trochę trudniejsze, ale twoja uwaga do "hibernate.hbm2ddl.auto" zadzwoniła dzwonkiem. W końcu miałem jeden plik właściwości projektu z hibernate.hbm2ddl.auto ustawionym na create-drop i SessionFactory jednego z pakietów z hibernate.hbm2ddl.auto ustawionym na aktualizację. To spowodowało, że moje dane dotyczące tego pakietu były przechowywane w bazie danych, ale iteratory mają zostać ponownie uruchomione. Obrigado pela dica = D – Thomas

Powiązane problemy