2012-01-24 199 views
12

我有組件需要更新客戶和客戶地址(通過JDBC)的數據庫。從CustomerDAO調用CustomerAddressDAO是否合適?或者創建一個單獨的「CustomerDataManager」組件來分別調用它們?DAO可以調用DAO嗎?

+1

什麼阻止您在業務層中執行此操作? – Andre

回答

24

可以做到這一點,但是,這並不意味着你應該。在這些情況下,我喜歡使用具有使用兩個DAO的方法調用的服務(在這種情況下爲CustomerService)。您可以定義圍繞服務方法的事務,因此如果一次調用失敗,它們都會回滾。

調用其他DAO的DAO的問題是您將很快結束循環引用。依賴注入變得更加困難。

4

你可以調用一個DAO從另一個還要考慮在CustomerDAO建設CustomerAddressDAO(畢竟,它是關於客戶,但我不認爲你想有沒有客戶的客戶地址)。

4

很明顯,你可以用不同的方式做到這一點。但是,要正確回答這個問題,你應該從你的模型開始。在模型中,看看地址是一個實體(有自己的id並且也是獨立使用的東西),或者是一個值類型(在客戶環境中只有有意義的東西),那麼你將有兩種情況:

  1. 地址是實體: 在這種情況下,地址都有自己的道和客戶都有自己的道也不道應該進入另外一個如果有需要操作兩個部分的邏輯,那麼。必須位於您的應用程序邏輯中,而不是數據訪問層

  2. 地址是與客戶關聯的值類型: 在這種情況下,地址沒有單獨的數據訪問層如果。它將作爲包含Customer對象的一部分進行保存/恢復。

結論:如果設計合理,DAO不會相互訪問(在標準情況下)。

+1

「如果有一些邏輯需要操縱兩者,那麼必須在您的應用程序邏輯中,而不是在數據訪問層中。」 - 如果它需要交易? (例如,我需要確保客戶和地址都被刪除) – HEATH3N

+0

這是一個非常好的問題!我認爲,在這種情況下,將地址作爲與客戶關聯的值類型是有意義的。這允許與客戶一起處理地址,例如,刪除這兩個。 –