2017-05-14 61 views
3

我们遇到了遗留代码的问题。有一个“用户名”字段验证组,验证它的长度,并确保它至少包含一个字母:仅在保存(插入)时进行休眠验证

@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也正在验证所有属性。

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

回答

4

经过两天的研究,我发现如何使这项工作。
显然,指定仅在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在插入期间验证这些验证规则。
做的,这是非常简单的方式,我需要通过财产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)。