使用自定义ConstraintValidatorFactory
,通过使用下面的代码将其添加到配置中来识别hibernate会话,结果将对该工厂负责的任何操作(创建、更新)进行双重验证。
Validator 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>
Java: 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
}
Bean-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>
编辑:hibernate配置
<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)是否有任何与验证相关的配置?没有
约束被验证两次,因为您在文件"Hibernate-Configuration"中指定了两组Default
和Create
进行预保存验证。
根据XML映射,约束是Create
组的一部分,而类型Bean
的默认组序列也包含该组(根据Bean
上的@GroupSequence
注释)。因此,约束将被验证两次,一次作为默认组的一部分,一次作为Create
组的一部分。
因此,您要么在预保存时只验证一个组,要么更改Bean
类型的默认组序列。