Skip to content

Commit

Permalink
Fix for GRAILS-4981 "findBy in validation constraint causes error if …
Browse files Browse the repository at this point in the history
…another instance is associated"
  • Loading branch information
graemerocher committed Sep 15, 2009
1 parent 28f4547 commit 9c87f77
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
Expand Up @@ -18,6 +18,8 @@
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil;
import org.codehaus.groovy.grails.validation.GrailsDomainClassValidator;
import org.hibernate.SessionFactory;
import org.hibernate.FlushMode;
import org.hibernate.classic.Session;
import org.hibernate.collection.PersistentCollection;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeansException;
Expand Down Expand Up @@ -49,6 +51,26 @@ protected Object initialValue() {
}
};
private ApplicationContext applicationContext;
private SessionFactory sessionFactory;

@Override
public void validate(Object obj, Errors errors, boolean cascade) {
final Session session = sessionFactory.getCurrentSession();
FlushMode previousMode = null;
try {
if(session!=null) {
previousMode = session.getFlushMode();
session.setFlushMode(FlushMode.MANUAL);
}

super.validate(obj, errors, cascade);
}
finally {
if(session!=null && previousMode!=null) {
session.setFlushMode(previousMode);
}
}
}

/**
* Overrides the default behaviour and first checks if a PersistentCollection instance has been initialised using the
Expand Down Expand Up @@ -109,5 +131,13 @@ protected void postValidate(Object obj, Errors errors) {

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
if(applicationContext!=null) {
try {
this.sessionFactory = applicationContext.getBean("sessionFactory", SessionFactory.class);
}
catch (BeansException e) {
// no session factory, continue
}
}
}
}
@@ -0,0 +1,45 @@
package org.codehaus.groovy.grails.orm.hibernate

import org.hibernate.FlushMode

/**
* @author Graeme Rocher
* @since 1.1
*/

public class CustomValidatorAndDynamicFinderTests extends AbstractGrailsHibernateTests{

protected void onSetUp() {
gcl.parseClass('''
import grails.persistence.*
@Entity
class Foo {
String name
Foo partner
static constraints = {
name(validator: {name, foo ->
Foo similarFoo = Foo.findByNameIlike(name)
if (similarFoo && similarFoo.id != foo.id) return ['similar']
})
}
}
''')
}

// test for GRAILS-4981
void testCustomValidatorWithFinder() {
session.setFlushMode(FlushMode.AUTO)
def Foo = ga.getDomainClass("Foo").clazz

def foo = Foo.newInstance(name: 'partner1')
assert foo.save()
def partner = Foo.newInstance(name: 'partner2')
assert partner.save()
foo.partner = partner
assert foo.save()

}
}

0 comments on commit 9c87f77

Please sign in to comment.