gpt4 book ai didi

java - 仅在保存(插入)时进行 Hibernate 验证

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:52 24 4
gpt4 key购买 nike

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

@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 会验证所有属性,即使没有发生任何更改也是如此。

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

最佳答案

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

首先,我创建了一个名为 platform.persistence.InsertOnlyValidations 的接口(interface),用作仅在 pre-persist 期间验证的组。

然后,我将组添加到 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 事件期间将验证所有默认验证(javax.validation.groups.Default) InsertOnlyValidations 组。

关于java - 仅在保存(插入)时进行 Hibernate 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com