Domanda

I am trying to define unique constrain in DB. Let's take simple domain class

class Tag {

    String name

    static mapping = {
        sort name: "asc"
    }

    static constraints = {
        name(blank: false, nullable: false, unique: true)
    }
}

and then in controller

  def test() {

        def tag = new Tag(name: 'test');
        tag.save(flush:true);
        print tag.id

        tag = new Tag(name: 'test');
        tag.save(flush:true);
        print tag.id

        render "it works"
    }

the output is

1
null

My question is, how can I get exception after second save operation - it is important to know that second tag is not persisted so all further operations on it do not have sense.

È stato utile?

Soluzione

You can achieve this behaviour using failOnError.

But this way ValidationException is thrown when any validation error occurs, not only unique constraint.

  tag = new Tag(name: 'test');
  tag.save(flush:true, failOnError: true);
  print tag.id

Altri suggerimenti

you could also see the exception raised during save() by adding below entry in your grails-app/conf/Config.groovy

grails.gorm.failOnError=true

The save method informs the persistence context that an instance should be saved or updated which can have following optional parameters

save(validate:true, flush:true, failOnError:true)

Parameters:

validate (optional) - Set to false if validation should be skipped

flush (optional) - When set to true flushes the persistence context, persisting the object immediately and updating the version column for optimistic locking

failOnError (optional) - When set to true the save method with throw a grails.validation.ValidationException if validation fails.

insert (optional) - When set to true will force Hibernate to do a SQL INSERT

deepValidate (optional) - Determines whether associations of the domain instance should also be validated, i.e. whether validation cascades. This is true by default - set to false to disable cascading validation.

try to use this way and see all the errors raised during save.

if (!tag.save()) {  
       tag.errors.each {  
        println it  
    }  
}

Hope this helps you

Regards
Motilal

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top