2

次のように定義された 3 つのドメイン オブジェクトがあります。

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 = {}
}

BootStrap.groovy構成クラスのいくつかのテストデータを使用してこれらのドメインオブジェクトを次のように初期化しようとしたとき:

 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)
        }

次のエラーが表示されます:

| 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

ここで、13行目は

m1.save(failOnError:true)

何が問題なのか教えてください。または私が欠けているもの。

更新:belongsTo関係MemberCommunityオブジェクト を削除すると、エラーなしで動作します。

4

2 に答える 2

4

belongsTo: Communityにパーツを追加すると、それは に属するMemberと言っています。MemberCommunity

Memberオブジェクトを構築するとき、Communityに接続されている を提供していませんMemberMemberあなたはまだCommunityそれが属していると言っていないので、このようにコミットすることは爆発しています。

saveとにかく、保存を担当するbelongsToマークとして、それらの呼び出しは必要ありません。Communitym[x].save() の 3 行を取り出し、belongsToコードを読み込んで、期待どおりに動作するかどうかを確認します。

于 2012-07-13T16:53:55.940 に答える
1

オブジェクト作成の順序です。belongsTo は (少なくともデフォルトでは) 外部キー関係を作成するため、例に示したのとは逆の順序でオブジェクトを作成する必要があります (例: Bank、Community、Member)。

制約とマッピングをもう少し深く掘り下げて、デフォルトのメカニズムの一部を変更することもできます。Grails ガイドはかなり長く、Hibernate についての予備知識を前提としていることもありましたが、ほとんどの内容が含まれているはずです (「その他」および「高度な」トピックに進む必要があるかもしれません)。

于 2012-07-13T16:57:31.240 に答える