同時実行性の問題があります。エンティティを複数回保存しようとするwhileループで解決しようとしましたが、最大再試行回数に達します。私は、この問題を解決する他の方法があるかどうかについて話してはいけません。私はそれについての他のStackoverflowの投稿があります。 :)ストーリーは短いです:派生した列には一意の制約があり、衝突を避けるためにインクリメントし続ける数値部分が含まれています。ループでは、I:JPA並行性の問題「バッチのリリース時にまだJDBCステートメントが含まれています」
- 選択最大(some_value)
- インクリメント結果
- が明示的にそれが理由で失敗した場合、エンティティをフラッシュし、この新しい結果で新しいオブジェクトを保存する
- の試みユニークなインデックス、私はDataAccessExceptionをキャッチします。
このすべては、ループがステップ1に戻り、選択しようとする場合を除いて動作しているようですが、私が取得:
17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"
また、新しい例外がキャッチされます。一意の制約違反を引き起こす最初のフラッシュのようで、DataAccessException
はエンティティマネージャのバッチをクリアしません。これに対処する適切な方法は何ですか?私はJPAでSpringを使用しており、エンティティマネージャに直接アクセスすることはできません。私はそれが必要な場合私はそれを注入することができると思うが、それはこの問題に痛い解決策です。