2013-06-03 79 views
0

我面臨一個奇怪的行爲,我不明白。 事實上,我有一個DAO AbstractFacade,其中我注入了一個EntityManager。從這個抽象類我導出了許多子類。 首先,該項目沒有正常工作,導致許多例外。然後我從錯誤消息中注意到,我有一個讓EntityManager執行持久性作業的問題。這是奇怪,因爲我得到了一個返回Java繼承方法重寫實例變量

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

    protected EntityManager getEntityManager() { 
     return em; 
    } 

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

,所以我不知道爲什麼is'nt它的子類工作抽象類的吸?我有一個想法來覆蓋解決問題的方法,並且沒有更多的例外!

@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; 
    } 

那麼好,但迄今爲止,但我沒有satisfiyed因爲我could'nt找出它爲什麼did'nt重寫吸氣前工作嗎?

所以請如果有人知道爲什麼,讓我知道,非常感謝。

+2

你不重寫,你的影子。用簡單的話說就是 –

+0

。你不能。重寫僅適用於方法。 – ankurtr

+0

繼承和覆蓋的概念對於實例和類varibales和方法是不同的 – Uselesssss

回答

3

您不能覆蓋實例變量。如果你在子類中重新聲明它,你的影子與新的原始變量,但兩者仍然存在。

在第一種情況下,返回AbstractFacade#em變量,因爲這是getEntityManager()方法所在的位置。

只要您執行了getEntityManager()方法的override,就會返回AirportFacade#em變量。

+0

感謝您的答覆,但我想你missunderstood我的問題,因爲我已經知道重寫只適用於方法,但問題是爲什麼,在重寫getEntityManager方法之前我coudl'nt從AirportFacade注入的entityManager實例(em)它從AbstractFacade繼承了getEntityManager方法? – velocity

+0

@velocity:好的。問題標題特別是您提供的信息表明您在重寫實例變量時遇到問題。如果不是這種情況,你需要重新解釋你的問題,或者可能問一個新的問題,如果它成爲一個完全不同的問題。 – Keppil

+0

@velocity:在您的問題開始時,您似乎表明您的第一個版本中也有一個實體管理器,但它無法正常工作。在這種情況下,這與繼承和重寫無關。 – Keppil

0

這是您的問題的可能解決方案之一。您無法覆蓋字段,但PersistenceContext註釋也可以在setter上使用。下面的解決方案讓你在子類中使用不同的上下文。

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; 
    } 
}