0

通过使用以下代码将其添加到配置中来使用知道休眠会话的自定义ConstraintValidatorFactory会导致对该工厂负责的任何操作(创建、更新)进行双重验证。

这个例子中的验证器ValidBeanDatabase被不同的实例调用了两次。所有其他约束都验证一次(@ValidBean例如)。

工厂和验证器的实现与本文中的类似:
https ://community.jboss.org/wiki/AccessingTheHibernateSessionWithinAConstraintValidator

验证.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
}

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>

编辑:

休眠配置

<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?

4

1 回答 1

0

约束被验证两次,因为您在文件 "Hibernate-Configuration"DefaultCreate.

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

因此,您要么在 pre-persist 时仅验证一个组,要么更改该Bean类型的默认组序列。

于 2013-06-08T11:55:21.827 回答