問題
JPA-2 アノテーション付き永続ユニットを含む jar を指定して、特定の永続ユニット内のすべての @Entity クラスのリストをプログラムで取得する必要があるスタンドアロン ユーティリティ プログラムを作成しています。
この情報を取得するために 2 つの方法のどちらが適しているか、またその理由を判断したいと思います。または、私が考えていない別のより良い方法がある場合。
解決策 1
Java プログラムはクラスパスに jar を配置し、JavaSE 方法論を使用して jar 内のクラスから永続化ユニットを作成します。次に、javax.persistence クラスを使用して JPA メタモデルを取得し、そこからクラス トークンのリストを取得します。
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MY_ PERSISTENCE_UNIT");
Metamodel mm = emf.getMetamodel();
// loop these, using getJavaType() from Type sub-interface to get
// Class tokens for managed classes.
mm.getManagedTypes();
解決策 2
プログラムは、指定された jar 内のディレクトリとファイルをスキャンして persistence.xml ファイルを探し、指定された永続ユニット名を持つファイルを見つけます。次に、ファイルを XPath して<class>
XML 要素のリストを取得し、そこから完全修飾クラス名を読み取ります。名前から、クラス トークンを作成します。
制約/懸念事項
- 可能であれば、アプローチ1を使用したいと思います。
- このユーティリティはコンテナー内では実行されませんが、jar はコンテナー内で実行するように設計された EJB プロジェクトです。これはどのように問題になりますか?
- このユーティリティは、クラスパスで Open-EJB を使用して、すべての Java EE 6 クラスの実装を取得します。
- EJB プロジェクトは Hibernate で実行するように構築されていますが、ユーティリティは Hibernate 固有のものであってはなりません。
- つまずきはありますか?