在网上找了一个hibernate通用dao泛型接口代码:
public interface GenericDao<T> {
void create(T entity); void delete(T entity);}
实现类:
package com.dao;import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
GenericDao<T> {
private Class<T> clazz; @SuppressWarnings("unchecked")
public GenericHibernateDaoImpl() {
// 通过反射获取T的类型信息实例
this.clazz = (Class<T>) ((ParameterizedType) this.getClass()
.getGenericSuperclass ()).getActualTypeArguments()[0];
} public void create(T entity) { super.getSession().save(entity); } public void delete(T entity) {
super.getSession().delete(entity);
}.....
结果启动tomcat服务器的时候报java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType错误,什么问题?求解决。。
public interface GenericDao<T> {
void create(T entity); void delete(T entity);}
实现类:
package com.dao;import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
GenericDao<T> {
private Class<T> clazz; @SuppressWarnings("unchecked")
public GenericHibernateDaoImpl() {
// 通过反射获取T的类型信息实例
this.clazz = (Class<T>) ((ParameterizedType) this.getClass()
.getGenericSuperclass ()).getActualTypeArguments()[0];
} public void create(T entity) { super.getSession().save(entity); } public void delete(T entity) {
super.getSession().delete(entity);
}.....
结果启动tomcat服务器的时候报java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType错误,什么问题?求解决。。
如/**
*
*/
package com.zuxiang.annotationtest;import java.io.Serializable;
import java.util.List;
/**
* @author zuxiang
*
*/
public class Dao { public <T> void delete(Serializable entityId){
}
public <T> void update(T entity){
}
public <T> void save(T entity){
}
public <T> T find(Serializable entityId){
return t;
}
}
lz的意思就是想使用这个通用dao,尽量不写其他dao。明白吗?
你不能在运行时才去获取泛型的类型
也就是说,必须在编译器就明确这个泛型对象
public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
GenericDao<T>
按照这个类的定义来说,我觉得给类加上abstract比较好,不会让人产生歧义
getActualTypeArguments需要用这个函数的话,你的类就应该已经被指定了泛型类型
例如 public class MyDaoImpl<MyPOJO>
呵呵,abstract就沒有必要了。本身就是減少pg自己寫dao。lz試試這個:
public GenericHibernateDaoImpl() {
this.entityClass = null;
Class c = getClass();
Type t = c.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments();
this.entityClass = (Class<T>) p[0];
}
}
void create(Class<T> entity);void delete(Class<T> entity);}
把泛型定义在方法上就不会了!