2016-11-09 3 views
2

createNamedQueryをカスタマイズして、JPA EntityManagerにちょっとした情報を追加する必要があります。 私は多くのモジュールのプロジェクトビルドで作業しています。すべてのモジュールがEntityManagerのインスタンスに@PersistenceContext(unitName = "emModuleName")という名前で注釈を付けます。EntityManagerをカスタマイズする

インターフェイスEntityManagerを単純に拡張することはできないようですが、この問題に関するオンラインドキュメントはありません。

私のニーズに最も適したソリューションは誰ですか?

特定の実装を拡張することはできません。アプリケーションはJPA実装に依存しないためです。 ありがとう

+0

各JPAプロバイダは独自のクラスを持つEntityManagerを実装しているため、実装を拡張することはできないと言いますから、そのことはできません。 –

答えて

1

へのラッパーとして機能するEntityManagerの独自の実装を作成する方法もあります。 (あなたのケースではcreateNamedQuery)を傍受し、他のすべての呼び出しをunderylingオブジェクトに委譲します。

または

メソッド呼び出しを代行受信する独自​​のプロキシを作成します。

しかし、どちらの方法でも使用するのはそれほど簡単ではありません。

0

基本的なCRUDサービスの基本実装を提供するBaseEntityManagerを作成することができ、それぞれのDAOはBaseEntityManagerを拡張する必要があります。

BaseEntityManager:

public interface EntityManagerBase<E, K> { 
    E create(E entity); 
    void delete(E entity); 
    E update(E entity); 
} 

EntityManagerBaseImpl

public abstract class EntityManagerBaseImpl<E, K> implements 
     EntityManagerBase<E, K> { 

    private EntityManager entityManager; 

    private TransactionManager txManager; 

    private Class<E> type; 

    public E create(E entity) {  
     entityManager.persist(entity); 
     entityManager.flush(); 
     return entity; 
    } 

MyDaoImpl:

public class MyDaoImpl extends EntityManagerBaseImpl<MyDBO, Long> implements MyDao { 
//put your implementation of methods 
} 
関連する問題