如何使用Hibernate Validator验证表中多行的日期范围?

Mub*_*bin 7 java validation hibernate hibernate-validator bean-validation

我有一个自定义验证器,用于确保在保存实体之前应用某些业务规则.

例如(假设的),当ProductPrice保存下面定义的时,我验证给定产品的fromDate和endDate(由productId标识)与ProductPriceDB中该产品的现有行没有重叠.

@MyCustomValidator
class ProductPrice {

  Long productId;

  Date fromDate;
  Date toDate; 
}
Run Code Online (Sandbox Code Playgroud)

只要将其ProductPrice保存为单个实体,这样就可以正常工作.一旦该实体作为一对多关系添加到另一个实体中,如下所示,

class Product {
  List<ProductPrice> productPrices;
}
Run Code Online (Sandbox Code Playgroud)

更新父(Product)实体(为了保存它工作正常),以及子实体(List中的一个或多个ProductPrice)中的一些更改,然后它失败,因为保存List中的一个ProductPrice实例不知道接下来要保存的ProductPrice的任何信息.

详细说明:

假设数据库中有两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
Run Code Online (Sandbox Code Playgroud)

假设我想将rows(ProductPrice)作为Product实体的一部分更新为以下值:

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
Run Code Online (Sandbox Code Playgroud)

以上数据仍然有效,但hibernate验证器将失败.这是因为节省了第一排的时候,如果我查询数据库来检查fromDatetoDate现有行,然后将与第2行现有的数据库中的重叠.但这不正确,因为第二行也将用有效值更新.也可能是,表中有3行,我在当前事务中只更新其中的2行,第3行未触及.因此,我必须在验证器中查询数据库以检查有效性.

问题太长了,我可能不清楚解释问题.但总而言之,是否有可能查询当前的持久化上下文并获取脏的数据(即将保存)?

mom*_*ilo 1

它可以工作,但我不确定它的最佳效果如何,这取决于您的环境。

但想法是,当您查询数据库以检查现有行的 fromDate 和 toDate 时,您还应该查询要更新数据库的集合,并基于该集合来更新 fromDate 和 toDate,在这种情况下这将是有效的:)