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验证器将失败.这是因为节省了第一排的时候,如果我查询数据库来检查fromDate和toDate现有行,然后将与第2行现有的数据库中的重叠.但这不正确,因为第二行也将用有效值更新.也可能是,表中有3行,我在当前事务中只更新其中的2行,第3行未触及.因此,我必须在验证器中查询数据库以检查有效性.
问题太长了,我可能不清楚解释问题.但总而言之,是否有可能查询当前的持久化上下文并获取脏的数据(即将保存)?
它可以工作,但我不确定它的最佳效果如何,这取决于您的环境。
但想法是,当您查询数据库以检查现有行的 fromDate 和 toDate 时,您还应该查询要更新数据库的集合,并基于该集合来更新 fromDate 和 toDate,在这种情况下这将是有效的:)