我把Delete分享出来大家看看!
--------------------------------------------------------------------------------------------
public class IBasicDaoImpl<T> implements BasicDao<T> {
//方法一:
//实体类class
private Class<T> entityClass = null;
//ID字段的class
{
//getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)
// getGenericSuperclass 返回直接继承的父类(包含泛型参数)
Type type = getClass().getGenericSuperclass();
//解决多层继承拿泛型类型 //BaseServiceImpl<User> <- UserService <- PassportService
while(!(type instanceof ParameterizedType)){
type = ((Class<?>)type).getGenericSuperclass();
//为了避免写错代码出现死循环,加上这个保险。
if(type == null || "java.lang.Object".equals(type.getClass())){
break;
}
}
if(type instanceof ParameterizedType){
ParameterizedType parameterizedType = (ParameterizedType)type;
Type[] genericTypies = parameterizedType.getActualTypeArguments();
entityClass = (Class<T>)genericTypies[0];
}
}
-------------------------------------------------------------------------------------------------- public void delete(Long id) {
EntityManager entityManager = JpaUtils.getEntityManager();
try {
entityManager.getTransaction().begin();
//通过id去查询一个对象[持久状态的对象]
T t = entityManager.find(entityClass, id);
//删除数据[remove表示将一个持久状态的对象从表中移除]
entityManager.remove(t);
entityManager.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
entityManager.getTransaction().rollback();
} finally {
//关闭资源
JpaUtils.close(entityManager);
JpaUtils.close();
}
}
}
代码就是上面的代码!过这样我们就可以解决父类如何获取子类传递的泛型的问题!
----------------------------------------------------------------------------------
//方法二:
//获得超类的泛型参数的实际类型
Class<T> entityClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];