2012-01-24 11 views
12

私は顧客と顧客の住所(JDBC経由)のためにデータベースを更新する必要があるコンポーネントを持っています。 CustomerDAOからCustomerAddressDAOに電話するのが適切ですか?または、個別に呼び出す個別の "CustomerDataManager"コンポーネントを作成しますか?DAOはDAOを呼び出すことはできますか?

+1

ビジネス層でこれを行うことを阻んでいるのは何ですか? – Andre

答えて

24

あなたはです。ですが、それはあなたがすべきことではありません。このような場合、両方のDAOを使用するメソッド呼び出しを持つサービス(この場合はCustomerService)を使用したいと思います。サービスメソッドの周りでトランザクションを定義することができます。したがって、1つの呼び出しが失敗した場合は両方がロールバックされます。

他のDAOを呼び出すDAOの問題は、循環参照が非常に迅速に終了することです。依存性注入ははるかに難しくなります。

4

別のDAOを呼び出すこともできますが、CustomerDAOでCustomerAddressDAOを構築することもできます(結局のところ、それは顧客に関するものであり、顧客なしで顧客アドレスを持つとは思わない)。

4

明らかに、あなたはさまざまな方法でそれを行うことができます。しかし、この質問に適切に答えるには、モデルから始めてください。このモデルでは、Addressがエンティティであるかどうか(独自のIDを持ち、独立して使用されるかどうかを参照)、または値タイプ(顧客のコンテキストでのみ意味のあるもの)であることを確認します。

、住所は独自のダオ持ち、お客様が独自のダオどちらダオは、他の1にアクセスする必要があります持っている。この場合 その二つを操作する必要があるいくつかのロジックがある場合:。
  1. アドレスは、Entityです。

  2. 住所は、顧客に関連付けられた値の種類です。 この場合、アドレスには別のDAOがありませんlf。格納されているCustomerオブジェクトの一部として保存/復元されています。

結論:正しく設計されていれば、DAOは(標準的な状況では)お互いにアクセスしません。

+1

"2つを操作する必要があるロジックがある場合、そのロジックはデータアクセスレイヤではなくアプリケーションロジックになければなりません。 - トランザクションである必要がある場合はどうしますか? (例:お客様と住所の両方が削除されていることを確認する必要があります) – HEATH3N

+0

これは非常に良い質問です!私は、このシナリオでは、顧客に関連付けられた値タイプとして住所を持つことが理にかなっていると思います。これは顧客と一緒にアドレスを操作することを可能にする。 2つの削除。 –

関連する問題