Използването на персонализиран ConstraintValidatorFactory
, който е наясно със сесията на хибернация, като го добави към конфигурацията с помощта на следния код, води до двойно валидиране на всяка операция (създаване, актуализиране), за която отговаря тази фабрика.
Валидаторът 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
Добавяне на ограничение за сесия на Hibernate чрез xml картографиране.
<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? Не
configuration
в следното? Имате ли конфигурация, свързана с валидиране, на други места, напр. persistence.xml? Между другото. не е нужно да указвате фабриката за валидатор на ограничение в XML, просто я предайте, когато поставяте ValidatorFactory в конфигурационния обект: ValidatorFactory vf = Validation.byDefaultProvider().configure().constraintValidatorFactory( new SessionConstraintValidatorFactory ( sessionFactory).getValidatorFactory() ; - person Gunnar   schedule 08.06.2013