HibernateでMapなプロパティを扱う方法
Hibernateを使っていて、ふと困った状況に遭遇。
Hogeエンティティクラスのdescプロパティを永続化させるにはどうしたらいいのだろう?もし、descプロパティが、
というように、Mapの値が別のエンティティだった場合は、特に問題はない。しかし上記の場合はMapの値がString。これは困った。
Interceptorを自分で作って、onSave()やonFlushDirty()などを実装してstateを入れ替えてみたりして試行錯誤を繰り返すも、残念ながらうまくいかない。そこで、HibernateのForumをいろいろと検索していく中で、同じ話題を発見できた。
[Topic: Map of primitives using CollectionOfElements]
http://forum.hibernate.org/viewtopic.php?t=953403
このトピックの最後に掲載されている投稿に正解が書いてあった。具体的には、
としてあげることで、descプロパティのためにhoge_desc表が生成され、hogeエンティティとの関連にhoge_id列が、descプロパティのMapのkey値がdesc_key列に、value値がdesc_value値に、それぞれマッピングされて永続化されることになる。
HibernateのReferenceやJavadocには残念ながらズバリの解答は載ってなかったため、半ば諦めかけていた。Hibernate Forum++。


