2009-01-29 75 views
6

我有一個使用Spring的項目,並分解爲幾十個DAO和關聯的DTO。我使用JdbcTemplate,但沒有其他的東西,因爲它正是我很滿意的抽象級別。Spring中的延遲加載DTO字段

我目前正在通過在他們的getter中放置一些相當毛茸茸的代碼來對我的DTO執行延遲加載。

基本樣板的邏輯是: 1.如果字段不爲空返回其價值和出口 2.聯繫適當的DAO,並獲取相關的DTO 3.商店,直到下一次。

它工作正常,但我的低DTOs與一大堆DAO耦合,並不是如此POJOey。

如果我將邏輯放在DAO中,會出現另一個代碼異味,因爲它將處理它的DTO和Lazy Loading兩個CRUD,據我瞭解它對象應該有一個責任。

我希望有一個相對簡單的Spring方法,我可以用來在DAO和DTO之間注入一個Lazy Loader對象來實現這一點,但任何其他解決方案都適用於我。

任何想法?

回答

4

將DAO的DAO包裝起來更容易......這取決於您希望帶來多少模型。 DTO's通常不會用來作爲兩個或更多個獨立的數據庫/ dao調用帶來一對多。在這種情況下,你真的想要一個ORM。既然你在尋找一個道的答案......

沒有什麼能阻止你將DAO連接在一起給你一個單一的DTO。將DTO連接到DAO更容易。它不是一個真正的服務層,它只是構建DAO塊。 所以你可能有一個PersonDao和一個TelephoneNumberDao。一個人可以有一個以上的電話號碼,所以你也可以有PersonModelDAo,它使用PersonDao和TelephoneNumberDao作爲引擎。

或者,避免整個問題,並且不要嘗試在DTO級別映射人與電話號碼之間的1-N。只需讓你的用戶界面對正確的DAO進行正確的調用即可。在使用DTO的時候,我更喜歡這個。

+0

我喜歡這個回答(+1)丟失person.getTelephoneNumbers()的清晰度是一種遺憾, – 2009-01-29 15:04:13

3

引入包裝DAO並處理這些問題的服務層是很常見的。如果你擔心你將過多的樣板代碼放入你的DTO來處理延遲加載,也許使用AOP可能是實現這一目的的一種方法。您可能希望查看AspectJ並在編譯時或加載時進行編織。由於您將直接修改字節碼,因此您不必擔心基於代理的AOP的性能開銷。