【发布时间】:2017-12-21 16:42:17
【问题描述】:
我有一个自定义验证器,用于确保在保存实体之前将某些业务规则应用于实体。
例如(假设一个),当保存下面定义的 ProductPrice 时,我验证给定产品(由 productId 标识)的 fromDate 和 endDate 与现有的 ProductPrice 行没有重叠数据库中的产品。
@MyCustomValidator
class ProductPrice {
Long productId;
Date fromDate;
Date toDate;
}
只要将ProductPrice 保存为单独的实体,它就可以正常工作。一旦将该实体作为一对多关系添加到另一个实体中,如下所示,
class Product {
List<ProductPrice> productPrices;
}
当父(产品)实体更新(保存它工作正常),以及子实体中的一些更改(列表中的一个或多个 ProductPrice)时,它会因为保存 ProductPrice 的一个实例而失败List 不知道接下来要保存的 ProductPrice 的任何信息。
详细解释:
假设对于给定的Product,DB 中有两个ProducePrice 行,如下所示:
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
以上数据仍然有效,但是hibernate验证器会失败。那是因为当我查询数据库以检查现有行的fromDate 和toDate 时,保存第一行时,它将与数据库中存在的第二行重叠。但这是不正确的,因为第二行也将使用有效值进行更新。也有可能,表中有 3 行,而我在当前事务中只更新了其中的 2 行,第 3 行没有被触及。所以重要的是我必须在验证器中查询数据库以检查有效性。
问题太长,我可能无法清楚地解释问题。但是总结一下,是否可以查询当前的持久化上下文,得到脏的(即将被保存)的数据?
【问题讨论】:
标签: java hibernate validation bean-validation hibernate-validator