Использование пользовательского 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). ; - person Gunnar   schedule 08.06.2013