HibernateでMapなプロパティを扱う方法

Hibernateを使っていて、ふと困った状況に遭遇。

@Entity @Table(name=”…”) public class Hoge { ・・・ protected Map desc; ・・・ }

Hogeエンティティクラスのdescプロパティを永続化させるにはどうしたらいいのだろう?もし、descプロパティが、

protected Map desc;

というように、Mapの値が別のエンティティだった場合は、特に問題はない。しかし上記の場合はMapの値がString。これは困った。

Interceptorを自分で作って、onSave()やonFlushDirty()などを実装してstateを入れ替えてみたりして試行錯誤を繰り返すも、残念ながらうまくいかない。そこで、HibernateのForumをいろいろと検索していく中で、同じ話題を発見できた。

[Topic: Map of primitives using CollectionOfElements]

http://forum.hibernate.org/viewtopic.php?t=953403

このトピックの最後に掲載されている投稿に正解が書いてあった。具体的には、

@CollectionOfElements @JoinTable(name=”hoge_desc”, joinColumns=@JoinColumn(name=”hoge_id”) @MapKey(columns=@Column(name=”desc_key”)) @Column(name=”desc_value”, nullable=false) protected Map desc;

としてあげることで、descプロパティのためにhoge_desc表が生成され、hogeエンティティとの関連にhoge_id列が、descプロパティのMapのkey値がdesc_key列に、value値がdesc_value値に、それぞれマッピングされて永続化されることになる。

HibernateのReferenceやJavadocには残念ながらズバリの解答は載ってなかったため、半ば諦めかけていた。Hibernate Forum++。

このエントリーをはてなブックマークに追加

Yoichiro

(よういちろう)