Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.lang.Object
初始化的结果是1:java.lang.Object初始化的结果是2:ObjectExceptioninthread"main"org.hibernate.MappingE...
初始化的结果是1:java.lang.Object
初始化的结果是2:Object
Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.lang.Object
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:580)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:91)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:842)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:835)
at com.six.managerment.dao.impl.HibernateGenericDao.findById(HibernateGenericDao.java:89)
at com.six.managerment.dao.impl.HibernateGenericDao.main(HibernateGenericDao.java:134)
这是泛型dao实现类HibernateGenericDao
public class HibernateGenericDao<T> implements GenericDao<T>{
private Class<T> persistClass;
public HibernateGenericDao() {
persistClass =GenericUtil.getSuperClassGenericType(getClass());
}
@Override
public T findById(Serializable id) {
System.out.println("初始化的结果是1:"+persistClass.getName());
System.out.println("初始化的结果是2:"+persistClass.getSimpleName());
return (T)getSession().get(persistClass, id);
}
public static void main(String[] args) {
Users user=new Users();
HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>();
Users users=dao.findById("8a80765041352deb0141352ded110001")
}
}
这是获取泛型类型
public class GenericUtil {
private GenericUtil(){
}
public static Class getSuperClassGenericType(Class clazz){
return getSuperClassGenericType(clazz, 0);
}
public static Class getSuperClassGenericType(Class clazz, int index){
//取得该类的实体类型
Type genType = clazz.getGenericSuperclass();
//判断该类是否是泛型类
if(!(genType instanceof ParameterizedType)) {
return Object.class;
}
//返回该类的实际参数类型
Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
if( index >= params.length || index < 0){
return Object.class;
}
if(!(params[index] instanceof Class)){
return Object.class;
}
//返回该类的泛型类
return (Class)params[index];
}
}
总体提示Unknown entity: java.lang.Object,配置文件和映射都不错,就是老是出这个错误,不能获得实体类的实例 展开
初始化的结果是2:Object
Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.lang.Object
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:580)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:91)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:842)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:835)
at com.six.managerment.dao.impl.HibernateGenericDao.findById(HibernateGenericDao.java:89)
at com.six.managerment.dao.impl.HibernateGenericDao.main(HibernateGenericDao.java:134)
这是泛型dao实现类HibernateGenericDao
public class HibernateGenericDao<T> implements GenericDao<T>{
private Class<T> persistClass;
public HibernateGenericDao() {
persistClass =GenericUtil.getSuperClassGenericType(getClass());
}
@Override
public T findById(Serializable id) {
System.out.println("初始化的结果是1:"+persistClass.getName());
System.out.println("初始化的结果是2:"+persistClass.getSimpleName());
return (T)getSession().get(persistClass, id);
}
public static void main(String[] args) {
Users user=new Users();
HibernateGenericDao<Users> dao = new HibernateGenericDao<Users>();
Users users=dao.findById("8a80765041352deb0141352ded110001")
}
}
这是获取泛型类型
public class GenericUtil {
private GenericUtil(){
}
public static Class getSuperClassGenericType(Class clazz){
return getSuperClassGenericType(clazz, 0);
}
public static Class getSuperClassGenericType(Class clazz, int index){
//取得该类的实体类型
Type genType = clazz.getGenericSuperclass();
//判断该类是否是泛型类
if(!(genType instanceof ParameterizedType)) {
return Object.class;
}
//返回该类的实际参数类型
Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
if( index >= params.length || index < 0){
return Object.class;
}
if(!(params[index] instanceof Class)){
return Object.class;
}
//返回该类的泛型类
return (Class)params[index];
}
}
总体提示Unknown entity: java.lang.Object,配置文件和映射都不错,就是老是出这个错误,不能获得实体类的实例 展开
2个回答
展开全部
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作为一个构造方法参数穿进去就可以了。
你这样是得不到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就可以了
public class UserDaoImpl extends HibernateGenericDao implements UserDao{
}
你说的将User.class作为一个构造方法参数传进去,我不太明白User.class作为哪一个构造函数的参数传进去,麻烦你能不能说的具体点
追答
public class HibernateGenericDao implements GenericDao{
private Class persistClass;
public HibernateGenericDao(){
this(null);
}
public HibernateGenericDao(Class pclass) {
if(pclass==null)
persistClass =GenericUtil.getSuperClassGenericType(getClass());
else
this.persistClass=pclass;
}
如果你要直接用HibernateGenericDao:
HibernateGenericDao dao = new HibernateGenericDao(Users.class);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询