14

問題

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 固有のものであってはなりません。
  • つまずきはありますか?
4

2 に答える 2

14

誰かが興味を持っている場合に備えて、解決策 1 は機能しました。これが本質的に私がしなければならなかったことです:

public MySQLSchemaGenerator() throws ClassNotFoundException {
    Properties mySQLDialectProps = new Properties();
    mySQLDialectProps.setProperty("javax.persistence.transactionType", "RESOURCE_LOCAL");
    mySQLDialectProps.setProperty("javax.persistence.jtaDataSource", "");

    final EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence_unit_name>", mySQLDialectProps);
    final Metamodel mm = emf.getMetamodel();
    for (final ManagedType<?> managedType : mm.getManagedTypes()) {
      managedType.getJavaType(); // this returns the java class of the @Entity object
    }
  }

重要なのは、トランザクション タイプをオーバーライドし、persistence.xml で定義された jtaDataSource を空白にすることでした。他のすべては不要であることがわかりました。

于 2012-04-14T02:20:06.990 に答える
1

jar が整形式 (persistence.xml が適切な場所 - META-INF フォルダー内) である場合、すべて問題ないように見えます。

ユーティリティをコンテナー内で実行する必要はありません。JPA は JavaEE 仕様の一部ではありません。

于 2012-04-12T03:21:31.207 に答える