質問

既存のJPAマッピングを拡張する簡単な方法を探しています。アイデアは次のとおりです。

EJB3 + JPAモジュールを備えたEARプロジェクトがあり、ClassAアノテーションが付けられてテーブルclass_aにマップされています。ただし、他のモジュール(別のEJBモジュール)にClassBを追加し、ClassAにプロパティを追加します(拡張しますか?)。

私が考えている方法の1つは、これらの追加フィールドをclass_aテーブルに追加し、HQL以外のクエリを実行してそのデータを取得することです。型マッピング、列マッピングなど、手作業で多くのことをしなければならないので良くありません。

簡単なチェックを行いましたが、異なるEntityManagerFactoriesを使用し、最初のモジュールの一部のクラスが2番目のモジュールで表示されないため、2番目のモジュールでClassAを(ClassBで)拡張できないようです

<!> lt; jar-file <!> gt;はすでに見ました。 persistence.xml内のタグ。そのようなものが必要ですが、それを使用するには、最初のモジュールにそのファイルをリストする必要があり、それが存在する必要があります(見つからない場合はスキップしません)。拡張可能なモジュール(最初のモジュール)ではなく、拡張モジュール(2番目のモジュール)に配置できるようなものはありますか?

実行時にJPAマッピングを拡張する方法があれば素晴らしいでしょう。そのような方法はありますか?私の問題に別の解決策はありますか?

役に立ちましたか?

解決

実装されているソリューションは次のとおりです。 1つのjarと2つのEJBモジュールがあります:

  1. jarはベースです。拡張のベースエンティティとローカルインターフェイスを保持します。

    @Entity
    public class BaseEntity {
        public long id;
        @Id @GeneratedValue
        public long getId() {...
        ... other variables, getters, setters ...
    }
    
    @Local
    public interface EntitiyManagerWithExtendedEntitiesInterface {
        public EntityManager getEntityManager;
    }
    
  2. 最初のEJBモジュールは、ベースエンティティを拡張し、EJBを追加してそのエンティティマネージャを取得するモジュールです。このモジュールには、persistence.xml行と<jar-file>../path_to_first_jar_file.jar</jar-file>行も含まれています。

    @Entity
    ... discriminator annotations
    public class ExtEntity extends BaseEntity {
        ... additional fields here
    }
    
    @Stateless
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface {
        @PersitenceContext
        EntityManager em;
        public EntityManager getEntityManager() {
            return em;
        }
    }
    
  3. 2番目のEJBモジュールには、コンパイルにjarのみが必要で、最初のEJBの実行が必要なEJBがあります(EntitiyManagerWithExtendedEntitiesInterfaceインターフェースを実装するEJBが必要です)。

    @Stateless
    public class getSomeEntity {
        @EJB
        EntitiyManagerWithExtendedEntitiesInterface ext;
        EntityManager em;
        @PostConstruct
        public void injectEntityManager() {
            em = ext.getEntityManager();
        }
        public void ejbInterfaceMethod() {
            ... method that uses em variable (EntityManager)
        }
    }
    

この方法では、アプリケーションサーバーがモジュール間の依存関係を管理する必要があり、最初のEJBモジュールを簡単に交換して、別の拡張エンティティセットを含めることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top