使用知道hibernate会话的自定义ConstraintValidatorFactory
,通过使用以下代码将其添加到配置中,导致对此工厂负责的任何操作(创建,更新)进行双重验证。
此示例中的验证程序ValidBeanDatabase
使用不同的实例调用两次。
所有其他约束都经过验证一次(@ValidBean
为例)。
工厂和验证器的实现类似于这篇文章中的实施:
https://community.jboss.org/wiki/AccessingTheHibernateSessionWithinAConstraintValidator
的validation.xml
<constraint-validator-factory>package.SessionConstraintValidatorFactory</constraint-validator-factory>
<constraint-mapping>package/Bean-validation.xml</constraint-mapping>
爪哇:
final Configuration configuration = new Configuration().configure();
// get ValidatorFactory from validation.xml
final ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure()
.buildValidatorFactory();
// ... add SessionFactory to custom ConstraintValidatorFactory
((SessionConstraintValidatorFactory)validatorFactory.getConstraintValidatorFactory()).setSessionFactory(sessionFactory);
// set ValidatorFactory
configuration.getProperties().put("javax.persistence.validation.factory", validatorFactory);
豆:
@GroupSequence(value =
{
Bean.class, Create.class
})
@ValidBean // custom class-level constraint
public class Bean
{
// properties and validator annotations
}
豆的validation.xml
通过xml映射添加Hibernate会话感知约束。
<bean class="Bean" ignore-annotations="false">
<class>
<constraint annotation="package.ValidBeanDatabase">
<groups>
<value>package.groups.Create</value>
</groups>
</constraint>
</class>
</bean>
编辑:
休眠-配置
<property name="javax.persistence.validation.group.pre-persist">
javax.validation.groups.Default, package.groups.Create
</property>
Glassfish 3.1.2 使用Hibernate Validator 4.2
@Gunner 您是否在其他地方有任何与验证相关的配置,例如persistence.xml? 否
答案 0 :(得分:0)
约束经过两次验证,因为您在文件“Hibernate-Configuration”,Default
和Create
中预先保留时指定了两个用于验证的组。
根据您的XML映射,约束是Create
组的一部分,而类型Bean
的默认组序列也包含此组(根据@GroupSequence
注释Bean
注释1}})。因此,约束被验证两次,一次作为默认组的一部分,一次作为Create
组的一部分。
因此,您可以在预先保留时仅验证一个组,也可以更改Bean
类型的默认组序列。