当前位置: 首页 > 知识库问答 >
问题:

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

邴俊民
2023-03-14

我有一个自定义验证器,用来确保在实体保存之前对其应用一些业务规则。

@MyCustomValidator
class ProductPrice {

  Long productId;

  Date fromDate;
  Date toDate; 
}
class Product {
  List<ProductPrice> productPrices;
}

当父(Product)实体被更新(对于save,它工作得很好),以及子实体(列表中的一个或多个ProductPrice)中的一些更改时,它会失败,因为保存列表中ProductPrice的一个实例不知道下一步要保存的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验证器将失败。这是因为在保存第一行时,如果我查询数据库检查现有行的fromdatetodate,那么它将与数据库中现有的第二行重叠。但这是不正确的,因为第二行也将用有效值更新。也有可能,表中有3行,而我在当前事务中只更新其中的2行,第三行未被触及。所以重要的是我必须在验证器中查询数据库来检查有效性。

问题太长,我可能解释不清楚。但是总结一下,是否可以查询当前的持久性上下文并获得脏的(即将保存的)数据?

共有1个答案

司寇阳曦
2023-03-14

它可以工作,但我不确定它会有多好,这取决于你的上下文。

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

 类似资料:
  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 现在,我正在用Spring MVC开发一个web应用程序。 样品值可以是“0.05”、“1.00”、“12.55”等。 因此,如果有任何办法来解决这个问题,请点亮我。谢了。

  • 问题内容: 我正在尝试测试以确保某个日期有效(如果有人输入则应该是错误的)。 我如何在任何日期都可以这样做? 问题答案: 验证日期字符串的一种简单方法是将其转换为日期对象并进行测试,例如 以这种方式测试日期时,仅需要测试月份,因为如果日期超出范围,则月份会更改。如果月份超出范围,则相同。任何年份均有效。 您还可以测试日期字符串的位:

  • 问题内容: 我试图验证实际上是一个字符串的日期,尝试以格式打印它。这是代码。 输出为。我也想要验证。不知道如何进行。 问题答案: 默认情况下宽松。您需要在解析之前将其设置为非宽容。 与年份相比,这将导致提供无效的日期和/或月份。请注意,这并不能验证年份本身,因为基本上任何年份都是有效的。根据具体的功能要求,您可能希望对年份进行其他检查,例如,打开字符串,然后检查第一部分的长度是否为4。

  • 我明白验证在应用程序的几个层中都是必需的。但是,如果要在所有层中实施的验证都是相同的(大多数情况下都是这样),那么使用一个公共的验证框架是有意义的。这是Hibernate验证器的目标之一。 那么,哪条路走得更好呢?