0

我正面临一种我不理解的奇怪行为。事实上,我有一个 DAO AbstractFacade,我在其中注入了一个 EntityManager。我从这个抽象类派生了许多子类。首先,该项目没有正常工作,导致许多异常。然后我从错误消息中注意到我在让 EntityManager 执行持久性工作时遇到了问题。这很奇怪,因为我在抽象类中有一个 getter,它返回

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

到目前为止还不错,但我不满意,因为我无法弄清楚为什么在覆盖 getter 之前它不起作用?

所以,如果有人知道为什么,请告诉我,非常感谢。

4

2 回答 2

3

您不能覆盖实例变量。如果你在子类中重新声明它,你会用新变量遮蔽原始变量,但两者仍然存在。

在第一种情况下,AbstractFacade#em返回了变量,因为这是getEntityManager()方法所在的位置。

一旦你执行了一个override方法getEntityManager()AirportFacade#em变量就会被返回。

于 2013-06-03T13:22:31.210 回答
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;
    }
}
于 2013-06-03T13:35:09.203 回答