S2EJB3UnitとかS2JUnit4とか

id:shot6さんが言ってたJavaEE勉強会でのid:koichikさんからの話って、たぶんS2EJB3UnitとS2JUnit4のパッケージ構成とか位置づけとかそんな話なのかなと勝手に推測しているんですけど(全然ちがうかも、単に僕が相談したいだけだったりします)、個人的には今ある形のS2EJB3Unitとそのパッケージのorg.seasar.framework.ejb.unitは廃止しちゃってもいいのかなと思っています。

interface EntityReader extends DataReader {
}

みたいなインタフェースだけS2JUnit4から使うようにしてEntityReaderの実装はJPA実装のパッケージ(kuinaとかs2hibernate-jpaとかs2toplink?とか)にあればすっきりしそうです。
で、S2JUnit4はもっとブラッシュアップしてEJB3とかJPAに対応するというイメージです。

S2JUnit4の不安なところはJUnit4と重複したコードが結構あるということです。JavaDocに将来的にRunWithアノテーションにまつわるAPIをpublicにする予定みたいに書いてありますが、早くそうなってうまい具合に拡張できるといいなぁ。

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、メソッド数多いです...。