今天分享一個在JPA進行CRUD的時候碰見的一個問題:父類如何獲取子類傳遞的泛型!

我把Delete分享出來你們看看!java

--------------------------------------------------------------------------------------------  
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];
相關文章
相關標籤/搜索