0

私は理解できない奇妙な行動に直面しています。実際、私はEntityManagerを注入したDAO AbstractFacadeを持っています。この抽象クラスから、多くのサブクラスを派生させました。まず、プロジェクトが適切に機能せず、多くの例外が発生しました。次に、エラー メッセージから、EntityManager に永続化ジョブを実行させる際に問題があることに気付きました。を返す抽象クラスでゲッターを取得したため、それは奇妙でした

entityManager.
public class AbstractFacade<T> {
    private EntityManager em;
    private Class<T> entityClass;

    protected EntityManager getEntityManager() {
        return em;
    }

    public AbstractFacade(Class entityClass){
        this.entityClass = entityClass;
    }

では、なぜサブクラスで機能しないのだろうか? 問題を解決し、例外がなくなったそのメソッドをオーバーライドするというアイデアを得ました!

@Stateless
@LocalBean
public class AirportFacade extends AbstractFacade<Airport> implements AirportFacadeLocal{
    @PersistenceContext(unitName = "flams_pu")
    private EntityManager em;

    public AirportFacade(){
        super(Airport.class);
    }

    @Override
    public EntityManager getEntityManager(){
        return em;
    }

これまでのところとても良いですが、ゲッターをオーバーライドする前になぜ機能しなかったのか理解できなかったため、満足していません??

誰かが理由を知っているなら、私に知らせてください、そしてどうもありがとう。

4

2 に答える 2

3

インスタンス変数をオーバーライドすることはできません。サブクラスで再宣言すると、元の変数が新しい変数でシャドウされますが、両方とも存在します。

最初のケースでは、メソッドが AbstractFacade#em存在する場所であるため、変数が返されました。getEntityManager()

メソッドを実行するとすぐに、override代わりに変数が返されました。getEntityManager()AirportFacade#em

于 2013-06-03T13:22:31.210 に答える
0

これは、問題に対する可能な解決策の 1 つです。フィールドをオーバーライドすることはできませんが、PersistenceContextアノテーションはセッターでも機能します。以下のソリューションでは、サブクラスで異なるコンテキストを使用できます。

public class AbstractFacade<T> {

    protected EntityManager em;

    private Class<T> entityClass;

    protected EntityManager getEntityManager() {
        return em;
    }

    public AbstractFacade(Class entityClass){
        this.entityClass = entityClass;
    }
}

@Stateless
@LocalBean
public class AirportFacade extends AbstractFacade<Airport> implements AirportFacadeLocal{

    public AirportFacade(){
        super(Airport.class);
    }

    @PersistenceContext(unitName = "flams_pu")
    protected void setEntityManager(EntityManager em) {
         this.em = em;
    }
}
于 2013-06-03T13:35:09.203 に答える