当前位置: 首页 > 面试题库 >

仅在保存(插入)时进行休眠验证

陶星辰
2023-03-14
问题内容

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

@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组的接口,该接口将仅在预持久化期间进行验证。

然后,我将该组添加到了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模式仅在插入期间验证这些验证规则。
这样做的方法非常简单,我需要传递property 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组中包括的所有验证之外,还将验证所有默认验证()。



 类似资料:
  • 我们遇到了遗留代码的问题。对于“username”字段有一个验证集,验证其长度并确保至少包含一个字母: 我们面临的问题是,一些现有的遗留数据不适合这些验证,我试图找到一种方法,使这些验证对遗留数据(老用户)被忽略,而仍然适用于新创建的用户。 我正在考虑将验证移到方法(因此仅在实际更改时验证值),但这导致了一个异常:

  • 问题内容: 我希望Hibernate制作数据库文件(SQLite),但前提是不存在。 现在在hibernate.cfg.xml中,有以下一行: 问题是数据库文件一直在创建,即使该文件存在也是如此。 问题答案: 尝试将值切换为

  • 问题内容: 我对hibernate.hbm2ddl.auto = validate的实际工作方式很感兴趣,并且正在努力寻找全面的文档。 我们最近发现生产系统受到http://opensource.atlassian.com/projects/hibernate/browse/HHH-3532的影响(hibernate匹配名称上的外键,而不是签名,因此将为您重新创建外键)并hibernate.hbm

  • 问题内容: 有没有办法使用Hibernate全局设置属性(因此它将是所有实体的默认设置)? 问题答案: 在NHibernate中是 我不知道hibernate中的确切语法。

  • 问题内容: 是否可以在运行时关闭每个类的某些约束/注释?例如,如果我想对一个字段进行检查,那可能吗? 这将使测试更容易查看某个约束是否正确正确触发,因为我可以关闭所有其他约束,而只需检查一个约束即可。 问题答案: 是否可以在运行时关闭每个类的某些约束/注释?例如,如果我想对firstName字段进行@NotNull检查,那可能吗? 不它不是。Bean验证未定义此类功能。Hibernate Vali

  • 问题内容: 这分别是我的hbm和测试代码。我正在使用Spring的HibernateTemplate。我不使用DAO。使用Spring 2.0.7的Hibernate 2.2.5 血红蛋白 测试 超级测试班 错误 问题答案: 好的,根本原因是我对集合的映射无效。感谢这篇关于复合映射的文章 错误: 正确 完整的映射