我有一个自定义 validator ,可用来确保在保存实体之前对实体应用了一些业务规则。
例如(假设的一种),当保存下面定义的ProductPrice
时,我验证给定产品(由productId标识)的fromDate和endDate与数据库中该产品的现有ProductPrice
行没有重叠。
@MyCustomValidator
class ProductPrice {
Long productId;
Date fromDate;
Date toDate;
}
只要将
ProductPrice
保存为单个实体,此方法就可以正常工作。将该实体作为一对多关系添加到另一个实体中后,如下所示,class Product {
List<ProductPrice> productPrices;
}
当父(产品)实体更新(出于保存目的,它工作正常)以及子实体中的某些更改(列表中的一个或多个ProductPrice)时,它失败,因为在列表中保存了一个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
假设我想将作为
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
以上数据仍然有效,但是 hibernate validator 将失败。这是因为在保存第一行时,如果我查询数据库以检查现有行的
fromDate
和toDate
,则它将与数据库中存在的第二行重叠。但这是不正确的,因为第二行也将使用有效值进行更新。表格中可能有3行,而我在当前事务中仅更新其中2行,第3行未更改。因此,重要的是我必须在 validator 中查询数据库以检查有效性。一个问题太长了,在解释这个问题时我可能不清楚。但是总而言之,是否可以查询当前的持久性上下文并获取脏数据(即将被保存)?
最佳答案
它可以工作,但我不确定它的最佳程度,这取决于您的上下文。
但是想法是,当您查询数据库以检查现有行的fromDate和toDate时,您还应该查询将要从其更新数据库的集合,并基于该集合来更新fromDate和toDate,在这种情况下将是有效的:)