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したクラスなら何でもメンバにできるはず。