【发布时间】:2012-02-17 18:48:13
【问题描述】:
我的组件需要更新客户和客户地址的数据库(通过 JDBC)。从 CustomerDAO 调用 CustomerAddressDAO 是否合适?或者创建一个单独的“CustomerDataManager”组件来分别调用它们?
【问题讨论】:
-
是什么阻止您在业务层执行此操作?
我的组件需要更新客户和客户地址的数据库(通过 JDBC)。从 CustomerDAO 调用 CustomerAddressDAO 是否合适?或者创建一个单独的“CustomerDataManager”组件来分别调用它们?
【问题讨论】:
你可以这样做,但这并不意味着你应该这样做。在这些情况下,我喜欢使用一个服务(在这种情况下为CustomerService),它有一个使用两个 DAO 的方法调用。您可以围绕服务方法定义事务,因此如果一个调用失败,它们都会回滚。
DAO 调用其他 DAO 的问题是您很快就会得到循环引用。依赖注入变得更加困难。
【讨论】:
显然,您可以通过不同的方式进行操作。但是,要正确回答这个问题,您应该从您的模型开始。在模型中,查看 Address 是实体(具有自己的 id 并且也独立使用的东西),还是值类型(仅在客户的上下文中才有意义的东西。然后,您将有两种情况:
地址是一个实体: 在这种情况下,Address 有自己的 Dao,而 Customer 有自己的 Dao。两道都不应该访问另一道。如果有一些逻辑需要操作这两者,那么它必须在您的应用程序逻辑中,而不是在数据访问层中。
Address 是与 Customer 关联的值类型: 在这种情况下,地址本身没有单独的 DAO。它作为包含 Customer 对象的一部分被保存/恢复。
结论:如果设计得当,DAO 不会相互访问(在标准情况下)。
【讨论】: