7

私はいくつかのビジネスルールが保存される前にエンティティに適用されることを保証するために使用するカスタムバリデータを持っています。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 

上記のデータは引き続き有効ですが、ハイバネート検証ツール失敗するでしょう。これは、既存の行のfromDatetoDateを確認するためにデータベースにクエリを実行すると、最初の行を保存するとデータベースに存在する2番目の行と重複するためです。しかし、2行目も有効な値で更新されようとしているため、これは正しくありません。テーブルに3つの行があり、現在のトランザクションで2つしか更新していない可能性もあります.3つ目は変更されていません。したがって、バリデーターでデータベースを照会して有効性をチェックする必要があります。

あまりにも長い質問ですが、私は問題を説明するには明確ではないかもしれません。しかし、結論として、現在の永続コンテキストを照会して、ダーティな(保存しようとしている)データを取得することは可能ですか?

答えて

1

これはうまくいくことができますが、最適な状態になるかどうかはあなたの状況によって異なります。

しかし、既存の行のfromDateとtoDateを確認するためにデータベースを照会するときは、データベースを更新するコレクションを照会し、fromDateとtoDateを更新するコレクションに照会する必要があります。有効である:)

+0

詳細については、このlinkを参照してください

class Product { @Valid List<ProductPrice> productPrices; } 

@Validアノテーションを使用する必要があり、それはコレクション自体について何も知らない。 – Mubin

1

ではなくProductPriceProductエンティティにバリデータを入れて考えてみましょう:

@ProductPricesCheck 
class Product { 
    List<ProductPrice> productPrices; 
} 

...このようなバリ探して何かを:

class ProductPricesValidator implements ConstraintValidator<ProductPricesCheck, Product> { 
    @Override 
    public boolean isValid(final Product product, final ConstraintValidatorContext context) { 
    for (ProductPrice productPrice : product.getProductPrices()) { 
     // Insert logic for checking the date ranges don't overlap here... 
     // ...Return true or false as appropriate. 
    } 
    } 
} 
+0

これは私が考えていた1つのオプションでしたが、ProductPriceを個別に(Productの一部ではなく)更新すると、バリデータは自動的に更新されます。解雇されることはありません。 – Mubin

+0

おそらく両方のバリデータを持っているでしょうか?あなたのProductPriceバリデータの既存のコードを投稿することができれば、私はそれが現在どのように動作しているか正確にはわからないので、役立つかもしれません。 –

+0

私は両方のバリデータを持っている場合は、質問に記載されているように正確に回避しようとしている問題に実行されるProductPriceのバリデータが実行されます。私が現在持っているバリデーターは、製品ではなくProductPrice上で動作する点を除いて、答えで述べたものとまったく同じです。 – Mubin

0

あなたはバリデータが一度にコレクションから一つだけのエントリを取得し

関連する問題