Java 具有接口模型对象的通用Hibernate Dao
我在genericDao和模型接口方面遇到了一些问题 我实现了以下GenerichBernateDao: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&
@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