11

IDが次のように構成された休止状態のエンティティがあります

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

新しい要素の作成は、最初の実行では正常に機能します。しかし、アプリケーションを再起動してレコードを取得すると、次にこのエンティティを永続化しようとすると、休止状態は、アプリケーションが再起動されなかったときに生成された同じ ID を使用しようとします。

以下のエラーが表示されます。トレース オプションを使用して実行すると、ID が再利用されていることがわかりました。

*Hibernate: org_myEntity (entitiyJID, entitityName, id) 値 (?, ?, ?) に挿入します org.hibernate.util.JDBCExceptionReporter
SQL エラー: 20000、SQLState: 23505 org.hibernate.util.JDBCExceptionReporter 'TABLE_NAME' で定義された 'SQL120725164357680' で識別される一意または主キー制約または一意のインデックスで重複キー値が発生しました。org.hibernate.event.def.AbstractFlushingEventListener
データベースの状態をセッション org.hibernate.exception.ConstraintViolationException と同期できませんでした: できませんでした*

ちなみに、私は hibernate 3.3.2.GA、javax.persistance 2.0.0、および Derby 10.5.1 データベースを使用しています。

私の世代で何が問題なのか、どうすれば修正できるのか、誰か知っている人はいますか?

4

1 に答える 1

16

AUTO を使用すると、Hibernate はいずれかの戦略を選択して ID を生成します。参照から:

AUTO - 基になる DB に応じて、ID 列、シーケンス、またはテーブルのいずれか。

そのため、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 は、データベース内のシーケンスの名前です (手動で作成します)。

于 2012-07-25T17:04:06.583 に答える