GORM - Serializableなクラスをメンバとする
ここのところ、ず〜〜〜っと悩まされてきた問題が解決したので、エントリにまとめる。…って、このブログ、一ヶ月も放置してたんだなあ…。
問題:com.sun.syndication.feed.synd.SyndFeedImpl型のメンバが保存されない
例えば、下記のようなドメインクラスを作ったとする。
class FeedCache { def cache_obj // SyndFeedImplだと起動時にorg.hibernate.MappingException発生する Date cacheddate }
そして、それぞれのメンバに適切な値を入れ、save()する。
FeedCache fc = new FeedCache(cache_obj:feed, cacheddate:new Date()) fc.save()
次に、このインスタンスを取得するが、cache_objが入っていない(=null)!
FeedCache fc = FeedCache.get(1) log.debug("cache_obj="+fc.cache_obj) // -> 'cache_obj=null'
分析・考察
生成されたテーブルを見てみると、cache_objのカラムがない。まあ、"def"で宣言しているので、さもありなん。コメントで書いた通り、"SyndFeedImpl"とすると、どの型にしていいかGrails(Hibernate)に判断できないというのも分かる。
しかし、SyndFeedImplはjava.io.Serializableをimplementsしている。DBに保存することはできるはず。ではどのように設定したらいいのだろう?
解決
次のように宣言する。
class FeedCache { Serializable cache_obj Date cacheddate }
分かってみれば簡単。Grailsだからどうこう、という話ですらない!?
この方法なら、SyndFeedImplに限らず、Serializableインターフェースをimplementsしたクラスなら何でもメンバにできるはず。