0

Hibernate で Spring Data JPA を使用しています。

データベース テーブルにマップされた複合キーを持つクラスがあります。

JPARepository 拡張インターフェース オブジェクトを使用して保存操作を実行すると、コンソールに次のログが表示されます。

Hibernate: select rolefuncti0_.functionalityId as function1_4_0_, rolefuncti0_.roleId as roleId2_4_0_ from RoleFunctionality_Mapping rolefuncti0_ where rolefuncti0_.functionalityId=? and rolefuncti0_.roleId=?
Hibernate: insert into RoleFunctionality_Mapping (functionalityId, roleId) values (?, ?)

これは、同じデータで操作を繰り返すときに表示されるものです。

 Hibernate: select rolefuncti0_.functionalityId as function1_4_0_, rolefuncti0_.roleId as roleId2_4_0_ from RoleFunctionality_Mapping rolefuncti0_ where rolefuncti0_.functionalityId=? and rolefuncti0_.roleId=?

Spring Data は、最初にキーがデータベースに存在するかどうかを確認してから、挿入を実行しているようです。

hibernate が見つけた情報 (データベース エントリ/キーがデータベースに存在すること) をキャッチする方法が必要ですか? どうすればそれを確認できますか?

4

1 に答える 1

0

そのような方法はありません。Hibernate は、SQL クエリ自体を発行する場合を除いて、主キーが存在するかどうかを判断できません。Hibernate は、このチェックがアプリケーション ロジックによって行われ、これがパフォーマンスの最適化の問題になることを想定しています。

Hibernate が重複キーの問題に気付く唯一の機会は、データベース (または JDBC レイヤー) からの SQLException で、id フィールドの一意の制約違反について通知されます。また、SQLException が発生した場合は、常に Hibernate セッションを無効と見なす必要があります (Hibernate はインターセプターとリスナーの処理を考慮して有効な状態を保証できないため)。

したがって、追加のカウンターを使用するか、空きIDを一括で取得して予約するか、アプリケーション全体のイベント/メッセージングを使用して、キーがまだデータベースに存在しないことを確認する追加のロジックを提供できない限り、追加のクエリを発行する春の方法が道です。エンティティ ID の割り当てを同期するソリューション。

于 2013-09-29T16:29:27.180 に答える