Java 具有接口模型对象的通用Hibernate Dao

Java 具有接口模型对象的通用Hibernate Dao,java,spring,hibernate,Java,Spring,Hibernate,我在genericDao和模型接口方面遇到了一些问题 我实现了以下GenerichBernateDao: @Repository public abstract class GenericHibernateDao<T, PK extends Serializable> implements IGenericDao<T, PK> { @Autowired private SessionFactory sessionFactory; private Class<T&

我在genericDao和模型接口方面遇到了一些问题

我实现了以下GenerichBernateDao:

@Repository
public abstract class GenericHibernateDao<T, PK extends Serializable> implements IGenericDao<T, PK> {

@Autowired
private SessionFactory sessionFactory;

private Class<T> type;

@SuppressWarnings({ "unchecked", "rawtypes" })
public GenericHibernateDao() {
    Type t = getClass().getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType) t;
    type = (Class) pt.getActualTypeArguments()[0];
}

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory = sessionFactory;
}

@Transactional
public T add(T obj){
    getSession().persist(obj);
    return obj;
}

@Transactional
@SuppressWarnings("unchecked")
public T getById(PK id){
    T result = (T) getSession().load(type, id);
    return result;
}

@Transactional
@SuppressWarnings("unchecked")
public List<T> list(){
    Criteria crit = getSession().createCriteria(type);
    return (List<T>) crit.list();
}
...
-

我通过Spring applicationContext文件实例化IBattery以加载模拟电池实现。 它适用于persist,list(带条件),但由于“getById”导致加载失败,发送:

org.hibernate.MappingException: Unknown entity: ***.***.****.IBattery
这是正确的,因为只有实现(SimulationBattery)映射到hibernate.cfg.xml中,但我不明白为什么我可以添加、列出,但不能加载。。。 有人有解释吗

多谢各位

法比安


(我正在使用Hibernate、Spring和Java8)

当您持久化一个实体时,您将一个具体的实体实例传递给Hibernate。例如,Hibernate接收SimulationBattery的一个实例,从而知道您要持久化的实体的类型:SimulationBattery

当您列出时,您依赖于Hibernate的多态特性:您要求Hibernate返回IBattery的所有实体实例。Hibernate知道实现此接口的所有具体实体类(例如SimulationBattery和ProductionBattery)。因此,它从数据库中加载它们,并返回它们


但是当您通过ID请求一个特定实体时,Hibernate只知道该实体是实现IBattery的实体之一,并且它的ID是您传递的(例如42)。这是不够的。您可能需要SimulationBattery 42或ProductionBattery 42,但Hibernate不知道。因此失败了。

谢谢您的解释。所以,最后,我必须覆盖SpringMVC注入并手动执行。太令人沮丧了。。。
public interface IBattery {

  public int getId();

  public double getLevel();
  public void setLevel(double _level);
}
@Entity
public class SimulationBattery implements IBattery {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique = true, nullable = false)
private int id;

@Column(unique = false, nullable = false)
private double level;

@Override
public int getId() {
    return id;
}

@Override
public double getLevel() {
    return level;
}

@Override
public void setLevel(double _level) {
    level = _level;
}
org.hibernate.MappingException: Unknown entity: ***.***.****.IBattery