JPAエンティティマッピングの拡張
質問
既存の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モジュールがあります:
-
jarはベースです。拡張のベースエンティティとローカルインターフェイスを保持します。
@Entity public class BaseEntity { public long id; @Id @GeneratedValue public long getId() {... ... other variables, getters, setters ... } @Local public interface EntitiyManagerWithExtendedEntitiesInterface { public EntityManager getEntityManager; }
-
最初の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; } }
-
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モジュールを簡単に交換して、別の拡張エンティティセットを含めることができます。