Hibernate验证器-自定义工厂验证两次



使用自定义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"中指定了两组DefaultCreate进行预保存验证。

根据XML映射,约束是Create组的一部分,而类型Bean的默认组序列也包含该组(根据Bean上的@GroupSequence注释)。因此,约束将被验证两次,一次作为默认组的一部分,一次作为Create组的一部分。

因此,您要么在预保存时只验证一个组,要么更改Bean类型的默认组序列。

最新更新