2012-07-25 2 views
8

後に反復値を生成します。しかし、アプリケーションを再起動してレコードを取り戻すと、次回このエンティティを永続化しようとすると、hibernateは、アプリケーションが再起動されなかったときに生成された同じIDを使用しようとします。@GeneratedValueは= GenerationType.AUTOは、私は新しい要素の作成が最初の実行でOK働く</p> <pre><code>@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; </code></pre> <p>として設定IDと休止状態のエンティティを持って再起動

私は以下のエラーを取得し、トレースオプションを指定して実行している場合、私は、javaxの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*

を再利用されていた、私は3.3.2.GAを休止状態使用していますことを確認することができました.persistance 2.0.0とDerby 10.5.1データベース

私の世代で何が間違っているかも考えていますが、どうすれば修正できますか?

答えて

11

AUTOを使用する場合、HibernateはIDを生成する方法の1つを選択します。参照:

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

したがって、Derbyが使用している戦略を確認するには、生成されるIDを確認する必要があります。見た目は変わりますが、アプリを再起動するたびにジェネレータがリセットされます。設定を試してみてください

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

あなたはすぐにシーケンスジェネレータを使用して修正することができます。次のようになります。

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

ここで、ENTITY_SEQは、データベース内のシーケンスの名前(手動で作成する名前)です。

+1

もう少し面倒でしたが、「hibernate.hbm2ddl.auto」へのあなたの発言は鐘を鳴らしました。私は最後に、hibernate.hbm2ddl.autoがcreate-dropに設定されたプロジェクトプロパティーファイルと、hibernate.hbm2ddl.autoがアップデートするように設定されたバンドルのSessionFactoryを持っていました。そのため、そのバンドルのデータをデータベースに保存するが、イテレータは再起動する必要がありました。 Obrigado pela dica = D – Thomas

関連する問題

 関連する問題