私はいくつかのビジネスルールが保存される前にエンティティに適用されることを保証するために使用するカスタムバリデータを持っています。Hibernate Validatorを使用してテーブル内の複数の行にわたる日付範囲を検証する方法は?
例えば、以下に定義するProductPrice
が保存されている場合、特定の製品(productIdによって識別される)のfromDateとendDateが、その製品の既存のProductPrice
行と重複していないことを検証します。 DB。
これは、ProductPrice
が個々のエンティティとして保存されている限り正常です。その実体はでいくつかの変更に伴い、以下のように別のエンティティで1対多リレーションシップ、
class Product {
List<ProductPrice> productPrices;
}
親(製品)エンティティが(それが正常に動作します保存のために)更新されると追加されたら(リスト内の1つ以上のProductPrice)、リスト内のProductPriceの1つのインスタンスの保存は、次に保存されるProductPriceについて何も知らないので失敗します。
詳細説明:
DB内の2つのProducePrice
行は以下のように与えられたProduct
のためにそこにあると仮定:
Id Product Id From Date To Date Price
1 PRD-001 01-01-2016 10-06-106 29.99
2 PRD-001 11-06-2016 10-12-106 32.99
私はProduct
エンティティの一部として行(ProductPrice
)の両方を更新したいと
Id Product Id From Date To Date Price
1 PRD-001 01-01-2016 30-06-106 29.99
2 PRD-001 01-07-2016 31-12-106 32.99
上記のデータは引き続き有効ですが、ハイバネート検証ツール失敗するでしょう。これは、既存の行のfromDate
とtoDate
を確認するためにデータベースにクエリを実行すると、最初の行を保存するとデータベースに存在する2番目の行と重複するためです。しかし、2行目も有効な値で更新されようとしているため、これは正しくありません。テーブルに3つの行があり、現在のトランザクションで2つしか更新していない可能性もあります.3つ目は変更されていません。したがって、バリデーターでデータベースを照会して有効性をチェックする必要があります。
あまりにも長い質問ですが、私は問題を説明するには明確ではないかもしれません。しかし、結論として、現在の永続コンテキストを照会して、ダーティな(保存しようとしている)データを取得することは可能ですか?
詳細については、このlinkを参照してください
@Validアノテーションを使用する必要があり、それはコレクション自体について何も知らない。 – Mubin