org.hibernate.MappingException: Unknown entity: java.lang.Object

HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>();

你这样是得不到Users的,原因是这样的:

 //取得该类的实体类型
  Type genType = clazz.getGenericSuperclass();
  //判断该类是否是泛型类
  if(!(genType instanceof ParameterizedType)) {
   return Object.class;
  }

你在使用泛型DAO的时候,采用的是直接使用泛型DAO类:
HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>();

所以,这个dao的类型仍然是HibernateGenericDao;
使用getGenericSuperclass()方法得到的就是这个类的父类,Object;所以你直接返回了一个Object.class,注意,为什么这个方法的名字叫做getGenericSuperclass(),这个superclass已经说明了要使用反射获得具体的泛型类型的方式应该是:
class UserDAO extends HibernateGenericDao<User> implements IUserDAO{}
这样就行了,一定要有一个具体类型的子类,UserDAO里面的泛型类型(User)才能够被固定下来。

另外也不用尝试直接把HibernateGenericDao转型为ParameterizedType,因为就算你代码为:
HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>();
你dao.getClass得到的仍然是HibernateGenericDao<T>,这个T对于dao的类型来说,仍然只是个泛型类型,不会是真实的User.class

所以,如果你要坚持直接使用HibernateGenericDAO的话,建议你把User.class作为一个构造方法参数穿进去就可以了。
追问
你说的有道理。我又创建下面的类继承HibernateGenericDao<Users>就可以了
public class UserDaoImpl  extends HibernateGenericDao<Users> implements UserDao{
 }
你说的将User.class作为一个构造方法参数传进去,我不太明白User.class作为哪一个构造函数的参数传进去,麻烦你能不能说的具体点
回答
public class HibernateGenericDao<T> implements GenericDao<T>{
 private Class<T> persistClass;

public HibernateGenericDao(){
    this(null);
}

 public HibernateGenericDao(Class<T> pclass) {
if(pclass==null)
 persistClass =GenericUtil.getSuperClassGenericType(getClass());
else
this.persistClass=pclass;
 }

如果你要直接用HibernateGenericDao:
HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>(Users.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值