【问题标题】:Hibernate validations on save (insert) only仅在保存(插入)时进行休眠验证
【发布时间】:2017-10-13 07:52:19
【问题描述】:

我们遇到了遗留代码的问题。有一个“用户名”字段的验证集,验证它的长度并确保它至少包含一个字母:

@Column(name = "username")
@Size(min = 4, max = 40)
@Pattern(regexp = "^.*[a-zA-Z]+.*$")
private String username;

我们遇到的问题是一些现有的遗留数据不适合这些验证,我正在尝试找到一种方法使这些验证被遗留数据(旧用户)忽略,同时仍应用于新创建的用户。

我正在考虑将验证移至 setUsername(...) 方法(因此值将仅在实际更改时验证),但这导致了异常:

javax.validation.ValidationException: Annotated methods must follow the JavaBeans naming convention. setUsername() does not.

我还确保实体设置为 dynamicUpdate=true,但这无济于事,因为 hibernate 正在验证所有属性,即使没有发生任何更改。

如何防止在更新期间对现有实体执行这些验证?
我不希望修复影响同一实体上的其他属性验证,并且我无法更改休眠配置。

【问题讨论】:

    标签: java hibernate validation bean-validation jsr


    【解决方案1】:

    经过两天的研究,我发现了如何进行这项工作。
    显然,指定仅在INSERT 上验证的验证并不难。所需的唯一更改是将这些验证设置为特定验证组,并在 INSERT/pre-persist 事件期间验证该组。

    首先,我创建了一个名为platform.persistence.InsertOnlyValidations 的接口,用作一个组,该组将仅在预持久期间进行验证。

    然后,我将该组添加到 username 字段验证:

    @Column(name = "username")
    @Size(min = 4, max = 40, groups = {InsertOnlyValidations.class})
    @Pattern(regexp = "^.*[a-zA-Z]+.*$", groups = {InsertOnlyValidations.class})
    private String username;
    

    这指示 hibernate 不要将这些验证用作默认组的一部分。现在,我需要指示 hibernate 仅在插入期间验证这些验证规则。
    这样做的方法很简单,我需要传递javax.persistence.validation.group.pre-persist 属性,同时指出在pre-persist 事件期间将验证哪些组:

    javax.persistence.validation.group.pre-persist=javax.validation.groups.Default,platform.persistence.InsertOnlyValidations
    

    这指示 hibernate 在 pre-persist 事件期间,除了 InsertOnlyValidations 组中包含的所有验证之外,还将验证所有默认验证 (javax.validation.groups.Default)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多