簡體   English   中英

單DAO和通用CRUD方法(JPA / Hibernate + Spring)

[英]Single DAO & generic CRUD methods (JPA/Hibernate + Spring)

在我之前的問題, DAO和服務層(JPA / Hibernate + Spring)之后 ,我決定在使用JPA / Hibernate,Spring和Wicket的應用程序中僅使用一個DAO作為我的數據層(至少在開始時)。 提出了使用通用CRUD方法,但我不太確定如何使用JPA實現它。 你能給我一個例子或分享一個關於這個的鏈接嗎?

這是一個示例界面:

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);
    }
}

基於文章不要重復DAO,我們多年來一直使用這種技術。 在我們意識到我們犯了一個大錯誤之后,我們總是在解決模式問題。

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

如果你調用myDao.saveEntity而不僅僅是entityManager.saveEntity你會保存嗎? 不會。你將有一個不必要的dao類,除了將成為EntityManager的包裝器之外什么也不做。 不要害怕在EntityManager(或hibernate中的會話)的幫助下在服務類中編寫選擇。

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

我在尋找同樣的事情。 我發現了SpringSource提供的Spring-Data JPA項目。 這是來自Hades的代碼端口,現在(2011年初)被Spring吞並並更好地集成。 它允許您將單個dao(SimpleJpaRepository)與靜態create一起使用,或者擴展基本JpaRepository類以使用現成的CRUD +方法創建任何特定於對象的dao。 也可以通過使用params名稱作為接口中的方法名稱(不需要實現!),即findByLastname(String lastName); 看起來非常有前途 - 作為Spring項目的一部分肯定會確保它的未來。 我現在已經開始在即將開展的項目中實現這一點。

如果您正在尋找第三方實施,可以查看http://www.altuure.com/projects/yagdao/ 它是一個基於注釋的通用DAO框架,支持JPA和hibernate

您也可以查看http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

相關代碼可以在github https://github.com/bennidi/daoism上找到

它集成了Spring和Hibernate和EclipseLink的配置示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM