今天分享一个在JPA进行CRUD的时候遇见的一个问题:父类如何获取子类传递的泛型!

时间:2021-07-30 15:39:44

我把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];