私は、Hibernate と結合テーブルとの多対多の関係を使用するエンタープライズ アプリケーションに取り組んでいます。本番環境 (大量) で、再現できない非常に散発的なデータベースのデッドロックが発生しています。
カテゴリ.java
public class Category {
....
private Set<Product> products = new HashSet<Product>();
...
}
カテゴリ.hbm.xml
<class
name="Category"
table="CATEGORY"
>
...
<!-- uni-directional many-to-many association to Product -->
<set
name="products"
table="CATEGORY_PRODUCT_ASSC"
lazy="false"
cascade="none"
>
<key column="CATEGORY_ID" />
<many-to-many class="Product" column="PRODUCT_ID" />
</set>
</class>
Product.java、Product.hbm.xml には一連のカテゴリがありません。これは一方向の多対多であるためです。
このテーブルは、とCATEGORY_PRODUCT_ASSC
の 2 つの列しかない単純な結合テーブルです。 CATEGORY_ID
PRODUCT_ID
Session.saveOrUpdate
現在、 CATEGORY_PRODUCT_ASSC 結合テーブルに挿入を取得するという唯一の目的で、Category インスタンス オブジェクトを呼び出しています (Category では何も変更されていません)。
休止状態をオンにするshow_sql
と、次のように表示されます。
update CATEGORY set NAME=?, DESCRIPTION=?, where category_id=?
insert into CATEGORY_PRODUCT_ASSC (CATEGORY_ID, PRODUCT_ID) values (?, ?)
問題は、複数のサーバーで同じカテゴリに対してまったく同じ秒で多くの製品が作成されていることです。
デッドロックが発生すると、update CATEGORY
必然的に呼び出しが関係します。これらのupdate CATEGORY
SQL ステートメントが実行されないようにする必要があります。
オプション 1: Session.saveOrUpdate(category) を呼び出して Category を更新せず (変更されていないため)、結合テーブル CATEGORY_PRODUCT_ASSC に挿入する方法はありますか?
オプション 2: そうでない場合は、JDBC を介して CATEGORY_PRODUCT_ASSC 行の単純な INSERT を実行することを検討しました。ただし、懸念事項の 1 つは、キャッシュ内の古い Hibernate オブジェクト (Category オブジェクト) です。この可能なアプローチに関するアイデア/推奨事項はありますか?
よろしくお願いいたします。:-)