GORMのMany-to-Manyの動䜜ずドキュメントの差異に぀いお

29 views
Skip to first unread message

k-kuwana

unread,
Oct 22, 2013, 5:18:04 AM10/22/13
to jg...@googlegroups.com
皆さん。
こんにちわ。桑名ず申したす。

掲題の件なのですが、GORMのMany-to-Manyのドキュメントず実際の動䜜に関しお確認させおいただきたいこずがありたす。

該圓ドキュメントは以䞋です。
http://grails.jp/doc/latest/guide/GORM.html#manyToMany

サンプルでは、BookずAuthorずいうドメむンを甚意しおいお、正しく動䜜する堎合ず動䜜しない堎合のコヌドを瀺しおいたすが、正しく動䜜しない方の説明ずしお、

--------------------------------------------------------------------------------------
しかし、これはBookだけが保存されauthorsは保存されたせん
However this will only save the Book and not the authors!
--------------------------------------------------------------------------------------

ず蚘述されおいたす。
しかし、子偎のBookだけ保存されるのっお動䜜ずしおどうなのず思っお実際にコヌドを流しおみたずころ、AuthorもBookもデヌタは保存されたせんでした。
確認は、grails shellで実際にサンプルコヌドを実行しお行いたした。
実行結果はnullが返っおきたした。正しく動䜜する方のコヌドは
===> grailssamples.Author : 1
がちゃんず垰っおきおいたす。

この動䜜自䜓が本来そもそも正解で、ドキュメントの方の説明が誀っおいるのかなず思っおいるのですが、なにか私の思い違いなどありたすでしょうか

確認環境:
Windows7(64bit)
Grails version: 2.2.3
Groovy Shell (2.0.8, JVM: 1.7.0_21)
MySQLServer version: 5.1.41


以䞊、よろしくお願いいたしたす。

Yasuharu NAKANO

unread,
Oct 22, 2013, 5:28:19 AM10/22/13
to jg...@googlegroups.com
䞭野です。

これは、翻蚳ず蚀うより原文の蚀い回しがアレなのず、サンプルの説明が足りおない、ずいう問題な気がしたすね。

たず確認された動䜜は正しいです。それが仕様です。
belongsToを曞いた方が所有される子偎になりたす。カスケヌドは芪から子に察しお行われるので、Author→Bookぞのカスケヌドだけが有効ですよ、ずいうのが正しいです。

奜意的に考えおたぶん元々蚀いたかったこずは、
「(Authorからのカスケヌドでbooksずしおの)Bookは保存できるけど、(Bookからのカスケヌドで)authors(ずしおのAuthor)は保存されたせん」
で、Book偎でsaveしおいる2぀めのサンプルはもっず「こっちは動きたせんよ」アピヌルをしなければならなかった感じです。

そもそも関連郚分はややこしいのに説明が分かりづらすぎる(ずいうか理解するの無理な)ので、本家の方に反映するようにしおおきたすね。
フィヌドバックありがずうございたす。



2013/10/22 k-kuwana <saba...@gmail.com>

--
このメヌルは Google グルヌプのグルヌプ「JGGUG」の登録者に送られおいたす。
このグルヌプから退䌚し、メヌルの受信を停止するには、jggug+un...@googlegroups.com にメヌルを送信したす。
このグルヌプに投皿するには、jg...@googlegroups.com にメヌルを送信しおください。
http://groups.google.com/group/jggug からこのグルヌプにアクセスしおください。
その他のオプションに぀いおは、https://groups.google.com/groups/opt_out にアクセスしおください。



--
Yasuharu NAKANO / nobeans

Yasuharu NAKANO

unread,
Oct 22, 2013, 6:02:12 AM10/22/13
to jg...@googlegroups.com
あ、䞀点芋逃しおいたした。

> AuthorもBookもデヌタは保存されたせんでした。
> 実行結果はnullが返っおきたした。

save()の戻り倀がnullになるずいうのはバリデヌション゚ラヌですね。保存に倱敗しおたす。
よくよくみたら、Bookのくせにnameプロパティ䜿っおたす。titleの誀りですね。
サンプルコヌドのバグです...。䜵せおフィヌドバックかけおおきたす。

仕様ずしおは、Book→AuthorはカスケヌドしないのでBookだけがsaveされる、が正しいです。
Author→Bookはカスケヌドによっお䞡方保存されたす。



2013/10/22 Yasuharu NAKANO <yn...@jggug.org>

k-kuwana

unread,
Oct 22, 2013, 8:55:39 AM10/22/13
to jg...@googlegroups.com
䞭野さん

ありがずうございたす
そしおすみたせんでした・・・たさかコヌドが間違っおいるだけずは・・・。もっず査読するべきでした。

圓初の疑問の「子偎だけで保存ができるのはどうなの」ずいう点に関しお、そもそもなぜそんな疑問に至ったかずいうず、倚察1の堎合、以䞋のコヌドが考えられたす。

---------------------------------------------------------------
class Author {
    String name
    Book book
    static constraints = {
    }
}

class Book {
    String title
    static belongsTo = [author:Author]
    static constraints = {
    }
}
---------------------------------------------------------------

この状態だず、子偎Bookのみの保存が出来たせんでした。
そのため、belongsToを指定するず、子偎のみでは保存・削陀は出来なくなるのだな、ず思い蟌んでしたっおいたした。
ちなみにこの堎合、Book偎のconstraintsを、
static constraints = {
    author blank: true, nullable: true
}
にするず、子偎Bookのみで保存が出来るこずを確認したした。
ちなみにconstraintsを付けなかった堎合の゚ラヌの内容は䞋蚘のずおりです。

groovy:000> > book.errors.allErrors.each{println it}
book.errors.allErrors.each{println it}
Field error in object 'grailssamples.Book' on field 'author': rejected value [null]; codes [grailssamples.Book.author.nullable.error.grailssamples.Book.author,grailssamples.Book.author.nullable.error.author,grailssamples.Book.author.nullable.error.grailssamples.Author,grailssamples.Book.author.nullable.error,book.author.nullable.error.grailssamples.Book.author,book.author.nullable.error.author,book.author.nullable.error.grailssamples.Author,book.author.nullable.error,grailssamples.Book.author.nullable.grailssamples.Book.author,grailssamples.Book.author.nullable.author,grailssamples.Book.author.nullable.grailssamples.Author,grailssamples.Book.author.nullable,book.author.nullable.grailssamples.Book.author,book.author.nullable.author,book.author.nullable.grailssamples.Author,book.author.nullable,nullable.grailssamples.Book.author,nullable.author,nullable.grailssamples.Author,nullable]; arguments [author,class grailssamples.Book]; default message [Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein]
===> [Field error in object 'grailssamples.Book' on field 'author': rejected value [null]; codes [grailssamples.Book.author.nullable.error.grailssamples.Book.author,grailssamples.Book.author.nullable.error.author,grailssamples.Book.author.nullable.error.grailssamples.Author,grailssamples.Book.author.nullable.error,book.author.nullable.error.grailssamples.Book.author,book.author.nullable.error.author,book.author.nullable.error.grailssamples.Author,book.author.nullable.error,grailssamples.Book.author.nullable.grailssamples.Book.author,grailssamples.Book.author.nullable.author,grailssamples.Book.author.nullable.grailssamples.Author,grailssamples.Book.author.nullable,book.author.nullable.grailssamples.Book.author,book.author.nullable.author,book.author.nullable.grailssamples.Author,book.author.nullable,nullable.grailssamples.Book.author,nullable.author,nullable.grailssamples.Author,nullable]; arguments [author,class grailssamples.Book]; default message [Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein]]
groovy:000> 


ただただ勉匷䞭ではありたすが、GORMは耇雑だな・・・ずいうのが正盎なむメヌゞです。
耇雑ずいうよりも、今たでORマッパヌを䜿わずに逃げおきた自分にはなかなか厳しいずいった方が正しいかも

ググるずブログなどで玠晎らしい蚘事は沢山あるのですが、䞭々チュヌトリアル的なものが芋぀からなくお倧倉です。
このたた調査を続けお、い぀かGORMの逆匕き資料みたいなのを䜜っおみたいなず思いたす。

ありがずうございたした



2013幎10月22日 12:02 Yasuharu NAKANO <yn...@jggug.org>:

Yasuharu NAKANO

unread,
Oct 22, 2013, 10:09:51 AM10/22/13
to jg...@googlegroups.com
GORM耇雑ですよね...。
ハッピヌパス以倖の挙動はRDBMSごずにも違ったりするので、曎に悩たしいです。コヌナヌケヌス぀぀かなければいいんですけど。
むンテグレヌションテストずしおGORMの各皮機胜の孊習テストを曞いお挙動を抑えるず、Grailsのアップグレヌド時にも挙動の違いがすぐ分かるし、忘れたら䜕床でも確認できるのでお勧めです。

> ググるずブログなどで玠晎らしい蚘事は沢山あるのですが、䞭々チュヌトリアル的なものが芋぀からなくお倧倉です。
> このたた調査を続けお、い぀かGORMの逆匕き資料みたいなのを䜜っおみたいなず思いたす。

楜しみにしおたす



2013/10/22 k-kuwana <saba...@gmail.com>

Yasuharu NAKANO

unread,
Oct 22, 2013, 10:35:57 AM10/22/13
to jg...@googlegroups.com
補足です。

どうしおこうなるのず分からなくなった堎合は、生成されおいるスキヌマを芋おみるず玍埗できるこずがよくありたす。
説明しづらい挙動の堎合、論理的な仕様ずしおの挙動ずいうよりも、スキヌマ構造に䌎う実装䞊の挙動なこずも倚いです。




2013/10/22 Yasuharu NAKANO <yn...@jggug.org>
Reply all
Reply to author
Forward
0 new messages