我们遇到了遗留代码的问题。"用户名"字段有一个验证集,验证其长度并确保它至少包含一个字母:
@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 正在验证所有属性,即使没有发生任何更改。
如何防止在更新期间对现有实体执行这些验证?
我不希望修复影响同一实体上的其他属性验证,并且无法更改休眠配置。
经过两天的研究,我发现了如何做到这一点。
显然,指定仅在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;
这将指示休眠不将这些验证用作默认组的一部分。现在,我需要指示休眠仅在插入期间验证这些验证规则。
执行此操作的方法非常简单,我需要传递属性javax.persistence.validation.group.pre-persist
,同时指示在pre-persist
事件期间将验证哪些组:
javax.persistence.validation.group.pre-persist=javax.validation.groups.Default,platform.persistence.InsertOnlyValidations
这将指示休眠在pre-persist
事件期间,除了InsertOnlyValidations
组中包含的所有验证之外,还将验证所有默认验证(javax.validation.groups.Default
)。