2010-02-17 79 views
5

這有沒有道理?假設我需要從DB中獲取一個與另一個對象(由DB中的外鍵和我的域對象中的組合)關聯的對象。如果在我的第一個DAO中,我獲取對象1的數據,然後爲對象2調用dao,最後(從第一個DAO中,調用對象1中的setter並將其提供給先前獲取的對象2)。從另一個DAO調用一個DAO?

我知道我可以做一個連接,但它似乎更加合乎邏輯,我去耦合功能(這就是爲什麼我懷疑從另一個調用一個道)。或者我應該將一些邏輯移到服務層?

感謝

更新:我想我解決了這個問題與答案的幫助:所有我需要做的是以下內容添加到我的對象1的映射:

<one-to-one name="Object2" fetch="join" 
     class="com...Object2"></one-to-one> 

我沒不必改變別的。謝謝您的幫助!

+0

我會說不,我已經在另一個線程解釋 http://stackoverflow.com/questions/8988252/can-a-dao-call -dao – 2012-11-27 21:27:35

回答

9

在閱讀此我只能得出結論,最有可能的,你這樣做是錯的..;)

如果你設置你的映射正確的對象A和對象B之間(可能是OneToOne,一對多或多對多),休眠將(懶惰)自動加載從A到B的引用。 這將消除查詢第二個DAO的需要,並在ObjectA中設置ObjectB引用。

更進一步,您甚至可能不需要ObjectO的DAO!

+0

謝謝..這是我正在努力的方向。我可以請一個這個映射看起來如何的例子(我沒有太多的運氣在谷歌)。另外,在映射正確的情況下,我是否仍然需要在DAO中指定「加入」? – oym 2010-02-17 23:03:09

+0

@ es11:我看到你已經解決了你的問題。很高興我能幫上忙。回答你的問題:你所擁有的東西似乎已經足夠了,所以不需要,在你的映射之外,當你從DAO中檢索你的對象時,你不必聲明任何連接。 – Tim 2010-02-17 23:26:57

+0

100%同意Tim! – 2010-06-11 06:08:02

6

我個人更喜歡避免DAO之間的引用。如果我需要通過DAO進行其他操作獲取數據我去耦的DAO:

// Bad - have to inject Dao into antoher Dao 
class FooDao extends BaseDao { 
    BarDao barDao; 

    public Foo complexLoad() { 
    return doFooStuff(barDao.loadBar()); 
    } 
} 

// Good - dependency on Bar only, not to Dao 
class FooDao extends BaseDao { 
    public Foo complexLoad(Bar bar) { 
    return doFooStuff(bar); 
    } 
} 

然後我注入的DAO都到服務。