in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy [54:121]
boolean validate(D instance, List validatedFieldsList, Map arguments = Collections.emptyMap()) {
Errors errors = setupErrorsProperty(instance);
Validator validator = getValidator()
if(validator == null) return true
Boolean valid = Boolean.TRUE
// should evict?
boolean evict = false
boolean deepValidate = true
Set validatedFields = null
if(validatedFieldsList != null) {
validatedFields = new HashSet(validatedFieldsList)
}
if (arguments?.containsKey(ARGUMENT_DEEP_VALIDATE)) {
deepValidate = ClassUtils.getBooleanFromMap(ARGUMENT_DEEP_VALIDATE, arguments)
}
evict = ClassUtils.getBooleanFromMap(ARGUMENT_EVICT, arguments);
fireEvent instance, validatedFieldsList
hibernateTemplate.execute { Session session ->
def previous = readPreviousFlushMode(session)
applyManualFlush(session)
try {
if (validator instanceof CascadingValidator) {
((CascadingValidator)validator).validate instance, errors, deepValidate
} else if (validator instanceof grails.gorm.validation.CascadingValidator) {
((grails.gorm.validation.CascadingValidator) validator).validate instance, errors, deepValidate
} else {
validator.validate instance, errors
}
} finally {
if(!errors.hasErrors()) {
restoreFlushMode(session, previous)
}
}
}
int oldErrorCount = errors.errorCount
errors = filterErrors(errors, validatedFields, instance)
if (errors.hasErrors()) {
valid = Boolean.FALSE
if (evict) {
// if an boolean argument 'true' is passed to the method
// and validation fails then the object will be evicted
// from the session, ensuring it is not saved later when
// flush is called
if (hibernateTemplate.contains(instance)) {
hibernateTemplate.evict(instance)
}
}
}
// If the errors have been filtered, update the 'errors' object attached to the target.
if (errors.errorCount != oldErrorCount) {
setErrors(instance, errors)
}
return valid
}