我正面临着一种我不理解的奇怪行为。 实际上我有一个DAO AbstractFacade,其中我注入了一个EntityManager。从这个抽象类我衍生出许多子类。 首先,该项目没有正常工作,导致许多例外。然后我从错误消息中注意到我在使EntityManager执行持久性作业时遇到了问题。这很奇怪,因为我在抽象类中得到了一个返回
的getterentityManager.
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;
}
到目前为止很好但是我并不满足,因为我无法弄清楚为什么它在重写吸气剂之前没有工作?
所以,如果有人知道原因,请让我知道并非常感谢。
答案 0 :(得分:3)
您无法覆盖实例变量。如果你在子类中重新声明它,那么 shadow 原始变量和新变量,但两者仍然存在。
在第一种情况下,返回了AbstractFacade#em
变量,因为这是getEntityManager()
方法所在的位置。
只要您使用override
方法的getEntityManager()
,就会返回AirportFacade#em
变量。
答案 1 :(得分: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;
}
}