Hibernate StaticMetamodel Generator Annotation Processor を動かす

Hibernate 3.5.0-Beta-2 がリリースだそうです。で、メタモデルを出力するaptの実装 Hibernate StaticMetamodel Generator Annotation Processor にも言及しています。さっそく試そうとしたのですが、Hibernate 3.5.0-Beta-2の配布ファイルには含まれていませんでした。

適当に探してみたところ、最近のSNAPSHOTのjarがこれみたい。

コードをみると明らかにJPA2.0に依存しています。依存しないほうがfactory pathに通すjarが少なくて楽なんですが。JPA 2.0のjarはここにありました。

Eclipseで試す手順はこんな感じ。

  1. EclipseでJava1.6のプロジェクトを作成します。
  2. ビルドパスに2つのjarを通します。
  3. プロジェクトのプロパティ画面を開き、左側のツリーメニューから Java Compiler - Annotation Processing と辿り、 「Enable project specific settings」のチェックボックスにチェックを入れます。
  4. プロジェクトのプロパティ画面を開き、左側のツリーメニューから Java Compiler - Annotation Processing - Factory Path と辿り、 「Enable project specific settings」のチェックボックスにチェックを入れます。
  5. 「Add JARs...」ボタンを押して2つのjarをファクトリパスに登録します。
  6. 次のようなエンティティクラスを作成します。
package aaa;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Emp {

	@Id
	private Integer id;

	private String name;

}

自動ビルドが有効であれば、上のコードをセーブするとこんなコードがプロジェクト直下の.apt_generatedフォルダに吐かれます。

package aaa;

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel(Emp.class)
public abstract class Emp_ {

	public static volatile SingularAttribute<Emp, Integer> id;
	public static volatile SingularAttribute<Emp, String> name;

}


感想とか

  • XMLファイルにも対応していました。persistence.xmlとかorm.xmlを読んで、アノテーションが付与されていないエンティティに対してもメタモデルをつくろうってことらしいです。
    • 今のままだとXMLだけで記述されたエンティティのメタモデルは毎回全再作成になるのでパフォーマンスが悪そう。対策するっぽいことが書かれています。
  • readme.txtにIdeaでの動かし方が書いてあるのになぜかEclipseに触れていませんでした。
  • Filer APIがおかしいって書いてあります。はまるところは同じだ。
  • 「aptのAPI使いにくぜ」的な過激なコメント(実際はもっと悪く言っている)があって苦笑しました。
  • メタモデルを出力してもこれを使ってCriteriaを組み立てないと意味無いんですが、そこまでやろうとは思えず。。。だれかtryしてみてください!
  • SVNリポジトリはここにありました。