hibernate验证程序-自定义工厂验证两次
使用自定义的hibernate验证程序-自定义工厂验证两次,hibernate,bean-validation,hibernate-validator,Hibernate,Bean Validation,Hibernate Validator,使用自定义的ConstraintValidatorFactory,该工厂通过使用以下代码将其添加到配置中来了解hibernate会话,这将导致对该工厂负责的任何操作(创建、更新)进行双重验证 在本例中,ValidatorValidBeanDatabase在不同的实例中被调用两次。 所有其他约束只验证一次(例如,@ValidBean) 工厂和验证器的实现与本文中的类似: validation.xml <constraint-validator-factory>package.Sess
ConstraintValidatorFactory
,该工厂通过使用以下代码将其添加到配置中来了解hibernate会话,这将导致对该工厂负责的任何操作(创建、更新)进行双重验证
在本例中,ValidatorValidBeanDatabase
在不同的实例中被调用两次。
所有其他约束只验证一次(例如,@ValidBean
)
工厂和验证器的实现与本文中的类似:validation.xml
<constraint-validator-factory>package.SessionConstraintValidatorFactory</constraint-validator-factory>
<constraint-mapping>package/Bean-validation.xml</constraint-mapping>
Bean:
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
<constraint-validator-factory>package.SessionConstraintValidatorFactory</constraint-validator-factory>
<constraint-mapping>package/Bean-validation.xml</constraint-mapping>
通过xml映射添加Hibernate会话感知约束
<bean class="Bean" ignore-annotations="false">
<class>
<constraint annotation="package.ValidBeanDatabase">
<groups>
<value>package.groups.Create</value>
</groups>
</constraint>
</class>
</bean>
package.groups.Create
编辑:
休眠配置
<property name="javax.persistence.validation.group.pre-persist">
javax.validation.groups.Default, package.groups.Create
</property>
javax.validation.groups.Default,package.groups.Create
玻璃鱼3.1.2
使用HibernateValidator 4.2
@炮手
您在其他地方是否有任何与验证相关的配置,例如persistence.xml否由于在文件“Hibernate配置”中预先保存时指定了两个验证组,
默认值
和创建
,因此该约束将被验证两次
该约束是根据XML映射创建的组的一部分,而类型为Bean
的默认组序列也包含该组(根据Bean
上的@GroupSequence
注释)。因此,约束将被验证两次,一次作为默认组的一部分,另一次作为Create
组的一部分
因此,您要么在预持久化时只验证一个组,要么更改Bean
类型的默认组序列。一些需要澄清的问题:您是如何触发验证的?在下面的示例中,如何使用配置
对象?您在其他地方是否有任何与验证相关的配置,例如persistence.xml?顺便说一句,您不必在xml中指定约束验证器工厂,只需在将验证器工厂放入配置对象时传递它:ValidatorFactory vf=validation.byDefaultProvider().configure().constraintValidatorFactory(新SessionConstraintValidatorFactory(sessionFactory).getValidatorFactory();