2010-10-08 113 views

回答

84

下面是一個例子接口:

public interface GenericDao<T, PK extends Serializable> { 
    T create(T t); 
    T read(PK id); 
    T update(T t); 
    void delete(T t); 
} 

和實施:

public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> { 

    protected Class<T> entityClass; 

    @PersistenceContext 
    protected EntityManager entityManager; 

    public GenericDaoJpaImpl() { 
     ParameterizedType genericSuperclass = (ParameterizedType) getClass() 
      .getGenericSuperclass(); 
     this.entityClass = (Class<T>) genericSuperclass 
      .getActualTypeArguments()[0]; 
    } 

    @Override 
    public T create(T t) { 
     this.entityManager.persist(t); 
     return t; 
    } 

    @Override 
    public T read(PK id) { 
     return this.entityManager.find(entityClass, id); 
    } 

    @Override 
    public T update(T t) { 
     return this.entityManager.merge(t); 
    } 

    @Override 
    public void delete(T t) { 
     t = this.entityManager.merge(t); 
     this.entityManager.remove(t); 
    } 
} 
+2

整合如何將這項契合與slsb和pojo實體(代表db表)? – NimChimpsky 2010-10-08 11:20:28

+3

很棒的回答。只有幾點意見:我寧願將Class作爲參數傳遞給構造方法(而不是未經檢查的轉換);刪除方法中的參數t不應該重新分配,並且類最好是抽象的。 – megathor 2014-07-16 01:58:48

+0

謝謝!!!!!!!!很多! – verystrongjoe 2015-08-28 06:12:46

5

我一直在尋找同樣的東西。我發現了SpringSource提供的JPA項目。這是一個代碼端口,從Hades開始,現在已經(2011年初)被Spring吞併並更好地整合。 它允許您使用靜態創建的單個dao(SimpleJpaRepository),或者擴展基礎JpaRepository類,以使用現成的CRUD +方法創建任何對象特定的dao。在接口中也允許使用參數名稱作爲方法名稱的grails(無需實現),例如​​ 看起來非常有前途 - 作爲Spring項目的一部分,它肯定會爲它確保一些未來。 我現在已經開始在即將開展的項目中實現這個功能。

14

根據文章Don't repeat the DAO我們使用這種技術多年。在意識到我們犯了一個大錯誤之後,我們一直在努力解決模式方面的問題。

通過使用ORM工具(如Hibernate或JPA),您不必分別考慮DAO和服務層。您可以在您的服務類中使用EntityManager,因爲您知道事務的生命週期以及您的實體類的邏輯。

如果您撥打myDao.saveEntity而不是簡單地撥打entityManager.saveEntity,您是否可以省時?不會。您將有一個不必要的dao類,它不會執行任何其他操作,但會成爲EntityManager的包裝。不要害怕在EntityManager(或休眠中的會話)的幫助下在你的服務類中寫入選擇。

還有一點需要注意:您應該定義服務層的邊界,並且不要讓程序員返回或等待實體類。 UI或WS層程序員根本不應該知道實體類只關於DTO-s。實體對象具有大多數程序員不知道的生命週期。如果將實體對象存儲在會話數據中並嘗試在數秒或數小時後將其更新回數據庫,則會遇到非常嚴重的問題。那麼你可能不會這樣做,但知道服務層的參數類型和返回類型的UI程序員只會保存一些代碼行。

+0

EJB中的註釋事務管理?雖然你可能需要更復雜的DAO,它不再是通用的,但無論如何。我仍然發現這種方法在特定情況下可能有用。 – 2015-02-05 07:34:25