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会话,这将导致对该工厂负责的任何操作(创建、更新)进行双重验证

在本例中,Validator
ValidBeanDatabase
在不同的实例中被调用两次。 所有其他约束只验证一次(例如,
@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();