2011-10-17 71 views
0

我們在Hibernate3.6-Spring 3.1中有一個應用程序。服務層應該知道存儲過程和參數嗎?

我有通用的DAO實現了一套這樣的,(http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

public abstract class GenericDaoImpl<T, ID extends Serializable> implements  GenericDao<T, ID> 
{ 

    public int executeSP(final String SP_NAME, Map<String, Object> params) 
    { 
    SQLQuery sq = getSession().createSQLQuery(SP_NAME);       
    sq.setProperties(params);  
    return sq.executeUpdate(); 

    } 
} 

而這個服務實現

@Transactional 
public class PejlAnalysisServiceImpl implements PejlAnalysisService, InitializingBean 
{ 
     private CisternDao cisternDao; 
     private PejlDataDao pejlDataDao; 

     private GenericDao genericDao; // <-- THIS? 

    private void test() 
    { 
      Map<String, Object> params = new HashMap<String, Object>(); 
      params.put("PARAM1",100); //AND THIS 
      genericDao.executeSP("MY_STORED_PROCEDURE", params); //And THIS 
    } 
} 

這真的是這樣做的正確方法?

P.S.存儲過程處理不同的數據庫表,因此它們不屬於特定的DAO impl。

回答

0

這真的取決於你的設計。在我寫的一個較小的項目中,我有一個StoredProcedure對象,其他組件使用,因爲單個存儲過程是存儲數據的唯一方法。我建議首先避免存儲過程,但是如果你堅持使用它們,你必須決定它們與你的設計的整體關係。它們是業務邏輯的重要組成部分,還是持久層的實現細節?

+0

它們是必不可少的,Ryan實際上幾乎是應用程序的核心,儘管只有5個SP。很多計算髮生。我不知道他們爲什麼決定在存儲過程中做到這一點。所以是的。我被困住了。 –

+2

所以是的,我認爲這聽起來像服務層SP的知識是合適的,因爲他們是應用程序的主要部分。你可能會考慮的一件事是將它們從DAO層次結構中分離出來,因爲就像你說的,它們不屬於任何一種DAO。給他們自己的房子可能會更好,比如「StoredProcedureManager」或者其他類似的東西。 –

+0

謝謝瑞恩。我現在實現了我自己的StoredProcedureManager來處理多個存儲過程。 :-) –