我有一个自定义 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 将失败。这是因为在保存第一行时,如果我查询数据库以检查现有行的fromDatetoDate,则它将与数据库中存在的第二行重叠。但这是不正确的,因为第二行也将使用有效值进行更新。表格中可能有3行,而我在当前事务中仅更新其中2行,第3行未更改。因此,重要的是我必须在 validator 中查询数据库以检查有效性。

一个问题太长了,在解释这个问题时我可能不清楚。但是总而言之,是否可以查询当前的持久性上下文并获取脏数据(即将被保存)?

最佳答案

它可以工作,但我不确定它的最佳程度,这取决于您的上下文。

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

09-25 22:04