正解は、次のステートメントを使用することです。
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
ただし、更新ステートメントが実行されると、休止状態が自動インクリメント値を受け取らなかったという問題が発生します。
次のブログ投稿を見つけました( http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s )そしてクエリを次のように変更しました:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
これは最終的に機能します。
このアプローチの解決できない問題は、同じトランザクション内で等しい2つのエンティティの挿入が機能しないことです。 2回目の挿入で正しい更新が行われたとしても、emは同じデータベース行を表す2つのエンティティインスタンスになります。これは許可されていません。
これを解決するには、制約のために等しくレンダリングされる2つのエンティティを挿入しないようにする必要があります。 (equals / hashcodeにはcomposite-unique-key制約と同じロジックを使用したため、バッチ挿入を実行するときにそのような重複を排除できます)