我们遇到了遗留代码问题。有一个用于“用户名”字段的验证集,用于验证其长度并确保其至少包含一个字母:
@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 血红蛋白 测试 超级测试班 错误 问题答案: 好的,根本原因是我对集合的映射无效。感谢这篇关于复合映射的文章 错误: 正确 完整的映射