EntityPersisterたち

HibernateのEntityをDataSetに変換したいのですが、そのとき使えそうなのがEntityPersisterです。

  • org.hibernate.persister.entity.SingleTableEntityPersister
  • org.hibernate.persister.entity.JoinedTableEntityPersister
  • org.hibernate.persister.entity.UnionSubclassEntityPersister

Entityのプロパティに紐づくテーブル名やカラム名を取得するメソッドがあって最初の印象では簡単にできるかもなんて思ったんですが、完全にテーブル構造に変換するにはすんなりいかないところもありそうです。まず、publicじゃないmethodも無理やり読まないと駄目そうです。いまわかっているのはPrimaryTableとSecondaryTableの結合に使われるカラムを返すメソッドがprotectedってことです。

protected String[] getKeyColumns(int j)

これが取得できないとEntityに含まれるSecondaryTableのカラムすべてを復元できないのです。

あと、複合キーがこんな風に定義されてたりすると

@Embeddable
public class TvMagazinPk implements Serializable {
    @ManyToOne
    public Channel channel;
    @ManyToOne
    public Presenter presenter;
}

複合キーの値を取得するのが大変です。もしかしたら簡単に取得できるAPIが用意されているのかもしれないのですけど今のところわかってないです。

上記の例はHibernate Annotationのテストケースにあるコードです。JPA的にはEmbeddableなクラスに@ManyToOneはつけるのは仕様外なんですけどHibernateではOKなんですよね。

それにしてもEntityPersister、メソッド数多いです...。