gtiwari333
gtiwari333

Reputation: 25174

Grails - when saving domain objects - i am getting "rejected value [null] error"

I have three domain objects defined as :

class Member {
    String name

    static constraints = {}
    static belongsTo=[community:Community]
}

class Community {
    String leaderName
    String code

    static constraints = {}
    static hasMany=[members: Member]
    static belongsTo=[bank:Bank]
}

class Bank {

    String bankName
    static hasMany=[communities: Community]
    static constraints = {}
}

When I tried to initialize these domain objects with some test data in BootStrap.groovy config class as :

 def init = { servletContext ->

            def m1 = new Member(name:"M1_Name")
            def m2 = new Member(name:"M2_Name")
            def m3 = new Member(name:"M3_Name")

            m1.save(failOnError:true)
            m2.save(failOnError:true)
            m3.save(failOnError:true)

            def comA = new Community(leaderName:"LeaderA", code:"AA")
            def comB = new Community(leaderName:"LeaderB", code:"BB")

            comA.addToMembers(m1)
            comA.addToMembers(m2)
            comB.addToMembers(m3)

            comA.save(failOnError:true)
            comB.save(failOnError:true)

            def bankA = new Bank(bankName:"BankA")
            def bankB = new Bank(bankName:"BankB")

            bankA.addToCommunities(comA)
            bankB.addToCommunities(comB)

            bankA.save(failOnError:true)
            bankB.save(failOnError:true)
        }

I am getting following error :

| Loading Grails 2.0.4
| Configuring classpath.
| Environment set to development.....
| Packaging Grails application.....
| Compiling 3 source files.....
| Running Grails application
| Error 2012-07-13 22:14:44,798 [pool-5-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: Validation Error(s) occurred during save():
- Field error in object 'mygrailtests.Member' on field 'community': rejected value [null]; codes [mygrailtests.Member.community.nullable.error.mygrailtests.Member.community,mygrailtests.Member.community.nullable.error.community,mygrailtests.Member.community.nullable.error.mygrailtests.Community,mygrailtests.Member.community.nullable.error,member.community.nullable.error.mygrailtests.Member.community,member.community.nullable.error.community,member.community.nullable.error.mygrailtests.Community,member.community.nullable.error,mygrailtests.Member.community.nullable.mygrailtests.Member.community,mygrailtests.Member.community.nullable.community,mygrailtests.Member.community.nullable.mygrailtests.Community,mygrailtests.Member.community.nullable,member.community.nullable.mygrailtests.Member.community,member.community.nullable.community,member.community.nullable.mygrailtests.Community,member.community.nullable,nullable.mygrailtests.Member.community,nullable.community,nullable.mygrailtests.Community,nullable]; arguments [community,class mygrailtests.Member]; default message [Property [{0}] of class [{1}] cannot be null]

Message: Validation Error(s) occurred during save():
- Field error in object 'mygrailtests.Member' on field 'community': rejected value [null]; codes [mygrailtests.Member.community.nullable.error.mygrailtests.Member.community,mygrailtests.Member.community.nullable.error.community,mygrailtests.Member.community.nullable.error.mygrailtests.Community,mygrailtests.Member.community.nullable.error,member.community.nullable.error.mygrailtests.Member.community,member.community.nullable.error.community,member.community.nullable.error.mygrailtests.Community,member.community.nullable.error,mygrailtests.Member.community.nullable.mygrailtests.Member.community,mygrailtests.Member.community.nullable.community,mygrailtests.Member.community.nullable.mygrailtests.Community,mygrailtests.Member.community.nullable,member.community.nullable.mygrailtests.Member.community,member.community.nullable.community,member.community.nullable.mygrailtests.Community,member.community.nullable,nullable.mygrailtests.Member.community,nullable.community,nullable.mygrailtests.Community,nullable]; arguments [community,class mygrailtests.Member]; default message [Property [{0}] of class [{1}] cannot be null]

   Line | Method
->>  13 | doCall                           in BootStrap$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   301 | evaluateEnvironmentSpecificBlock in grails.util.Environment
|   294 | executeForEnvironment . . . . .  in     ''
|   270 | executeForCurrentEnvironment     in     ''
|   303 | innerRun . . . . . . . . . . . . in java.util.concurrent.FutureTask$Sync
|   138 | run                              in java.util.concurrent.FutureTask
|   886 | runTask . . . . . . . . . . . .  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run                              in     ''
^   662 | run . . . . . . . . . . . . . .  in java.lang.Thread

Here, line 13 is

m1.save(failOnError:true)

Could you please suggest me what's wrong going on? Or what I am missing.

UPDATE : It is working without errors when I remove belongsTo relation in Member and Community objects.

Upvotes: 2

Views: 6029

Answers (2)

Robert
Robert

Reputation: 2471

Its the order of object creation. The belongsTo is going to create a foreign key relationship (at least by default), so you'd have to create the objects in the reverse order that you have them shown in your example (e.g. Bank, Community, Member).

You can also get into the constraints and mappings a little deeper to change some of the default mechanisms. The Grails guide is fairly long, and at times I found it assumed a bit of previous knowledge of Hibernate, but it should have pretty much most of this (you may have to go down to the "Other" and "Advanced" topics).

Upvotes: 1

skaz
skaz

Reputation: 22640

When you add the belongsTo: Community part to Member you are saying that Member will belong to a Community.

When you construct the Member object, you are not providing the Community that is connected with the Member. Committing the Member like this is blowing up because you haven't yet said the Community it belongs to.

You don't need those save calls there anyway, as belongsTo marks that Community will be responsible for the save. Take out the 3 m[x].save() lines, readd the belongsTo code and see if it works as expected.

Upvotes: 4

Related Questions