簡體   English   中英

關於使用 DAO/Spring MVC/Hibernate 的建議

[英]Advice about using DAO/Spring MVC/Hibernate

我試圖清楚地了解它是如何工作的:

- 使用帶有DAO接口的DAO class有什么好處?
-如何處理 Hibernate 異常,即

public String doSomething(){
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();

      Query query = session.createQuery("");

    Object o = query.uniqueResult();

    session.close();

    return "success";
}

我不是“被迫”嘗試/捕獲的,那么如何捕獲/攔截可能發生的任何異常?

-每次使用新的 DAO 方法打開 session 是否比獲得當前的 session 更昂貴? 如果我使用 get,我應該關閉 session 嗎?

問題更新:

我的服務類中有@Service 注釋,並且對於使用dao 接口的每個方法,我上面都有@Transactional。 我還在我所有的 DAO 類中添加了@Repository

更新二:

我正在考慮為這個問題開放賞金,因為我想知道更多細節,這次我會提供一些。

  1. Spring 上下文
  2. Controller
  3. 服務接口
  4. 服務實施
  5. DAO接口
  6. DAO 實現

所以我想盡可能地利用 spring MVC,我如何讓 @Transactional 處理 session 打開/關閉?

如果有異常,我如何捕捉異常(即不存在的記錄或數據庫失敗)。

我做錯了什么? 任何人都可以提出一些改進建議嗎?

hibernate session 方面的一些事情......

1.)我會看一下將Spring 的事務管理集成到您的項目中。 這樣您就不必擔心打開和關閉會話,因為 Spring 將使用 @Transactional 注釋為您處理攔截。

2.) 如果 spring 正在處理您的事務,您不必擔心執行 finally 調用以確保所有內容都已關閉或回滾。

3.) 如果您決定不使用 Spring 來管理會話,則不應將其長時間打開,但同樣,如果您使用 Spring,則不必擔心。

至於DAO類的接口,我提供這個......

1.) 對接口進行編碼被認為是一種很好的設計實踐(請參見下面留下的評論),這里有幾個很好的理由。

假設你有一個...

public interface ShoppingCartService{

    public void doStuff(Object obj);

} 

您可以將此服務公開為 servlet 並處理您的界面創建的“合同”,甚至隱藏您使用 Hibnerate、JDBC 或其他任何東西的事實......

@Service
public class PetShopShoppingCartService implements ShoppingCartService{

    @Transactional(propagation=Propagation.REQUIRED)
    public void doStuff(Object obj){
        //The Pet Shop service impl uses hibernate!;
    }
}

或者...

public class DrugStoreShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //The Drug Store service uses JDBC;
    }
}

甚至...

public class NextBigThingShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //do stuff with next big thing;
    }
}

我想你明白了。 如果您開發公共 api 或公開服務,這將變得非常重要。

最后,擁有接口的另一個很好的理由是在一個由多個開發人員組成的團隊中工作。 您可以快速刪除一個界面,簽入並告訴其他人這就是它的外觀。 這使他們能夠看到什么是重要的,甚至在需要時模擬他們自己的 impl ( ThingServiceMockDataImpl )

僅僅因為您在使用 Spring 的 HibernateTemplate 時不必強制捕獲異常並不意味着它們不會被拋出。 它們將只是RuntimeException而不是已檢查的異常。 此外, getCurrentSession()不會在每次調用時打開一個新的 session,它會返回本地線程的 Session。

使用 DAO 策略而不是將數據訪問代碼直接放入 controller 有很多優點,包括缺乏代碼耦合、封裝和事務分界。 有關詳細信息,請參閱http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

暫無
暫無

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

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