2014-04-14 45 views
0

我正在設置一個泛型類,它將作爲我應用程序中所有Dao類的基類,但是現在我正面臨一個錯誤。我的泛型類是這樣定義的;Dao類的泛型類

public class Dao<E> { 

    private final E entity; 

    @Autowired 
    SessionFactory sessionFactory; 

    protected Session getCurrentSession(){ 
     return sessionFactory.getCurrentSession(); 
    } 

    public Dao(E entity) { 
     this.entity = entity; 
    } 

    public E getEntity() { 
     return this.entity; 
    } 

    @Transactional 
    public boolean persist(E transientInstance) { 
     try { 
      sessionFactory.getCurrentSession().persist(transientInstance); 
      return true; 
     } catch (RuntimeException re) { 
      return false; 
     } 
    } 

    @Transactional 
    public boolean remove(E transientInstance) { 
     try { 
      sessionFactory.getCurrentSession().delete(transientInstance); 
      return true; 
     } catch (RuntimeException re) { 
      return false; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional 
    public E merge(E detachedInstance) { 
     try { 
      E result = (E) sessionFactory.getCurrentSession().merge(detachedInstance); 
      return result; 
     } catch (RuntimeException re) { 
      return null; 
     } 
    } 

    @Transactional 
    public E findById(int id) { 
     try { 
      E instance = (E) sessionFactory.getCurrentSession().get(E, id); 
      return instance; 
     } catch (RuntimeException re) { 
      return null; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional 
    public E findByUsername(String username) { 
     try { 
      E instance = (E) sessionFactory.getCurrentSession().createCriteria(E, username).add(Restrictions.like("login", username)).list().get(0); 
      return instance; 
     } catch (RuntimeException re) { 
      return null; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional 
    public List<E> findAll() { 
     try { 
      List<E> instance = sessionFactory.getCurrentSession().createCriteria(E).list(); 
      return instance; 
     } catch (RuntimeException re) { 
      return null; 
     } 
    } 

} 

與錯誤的方法是過去三年,並由get()和個createCriteria()在他們執行(誤差爲Ë相關referente到E不能被解析爲變量)。通常,當我不使用這種基於泛型的方法時,我會使用類似'Usuario.class'的東西。

任何人都知道如何解決這個錯誤在我的泛型類(如果這種方法甚至可能)。

+0

你還沒有告訴我們是什麼錯誤。請更新問題,至少告訴我們*錯誤信息是什麼,並在適當的情況下包含堆棧跟蹤。 – JonK

+0

您似乎試圖將'E'作爲參數傳遞給方法。泛型不能像那樣工作。 –

+0

我該怎麼做這項工作?有什麼辦法可以傳遞函數的期望值(正如我所說的,就像'User.class')? –

回答

1

首先,類型參數E不等於Class的實例。其次,由於Java的類型擦除,關於E的所有內容在運行時都會丟失。但它作爲參數傳遞給構造函數的entity是在嘗試請求類時要使用的類型標記。因此,改變方法如下:

@Transactional 
public E findById(int id) { 
    try { 
     E instance = (E) sessionFactory.getCurrentSession().get(entity.getClass(), id); 
     return instance; 
    } catch (RuntimeException re) { 
     return null; 
    } 
} 

@SuppressWarnings("unchecked") 
@Transactional 
public E findByUsername(String username) { 
    try { 
     E instance = (E) sessionFactory.getCurrentSession().createCriteria(entity.getClass(), username).add(Restrictions.like("login", username)).list().get(0); 
     return instance; 
    } catch (RuntimeException re) { 
     return null; 
    } 
} 

@SuppressWarnings("unchecked") 
@Transactional 
public List<E> findAll() { 
    try { 
     List<E> instance = sessionFactory.getCurrentSession().createCriteria(entity.getClass()).list(); 
     return instance; 
    } catch (RuntimeException re) { 
     return null; 
    } 
} 

,或者如果entity是不是你的類型的令牌,參數Class<E> clazz添加到構造是這樣的:

private final E entity; 
private final Class<E> clazz; 

public Dao(E entity, Class<E> clazz) { 
    this.entity = entity; 
    this.clazz = clazz; 
} 

,並在我的建議的方法使用clazz代替entity.getClass()

0

只需添加上面的答案。如果你不想在參數傳遞給你的構造函數,你可以做到以下幾點:

private Class<T> type; 

public Dao(){ 

    Type t = getClass().getGenericSuperclass(); 
    ParameterizedType pt = (ParameterizedType) t; 
    type = (Class<T>) pt.getActualTypeArguments()[0]; 
} 

,然後在標準引用類型,當你進行查詢。

附錄:從DAO層中刪除您@Transactional註解,@Transactional屬於你的服務層