古詩詞大全網 - 成語經典 - Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.lang.Object

Exception in thread "main" 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作為壹個構造方法參數穿進去就可以了。