2012-01-24 119 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

这是一个非常好的问题!我认为,在这种情况下,将地址作为与客户关联的值类型是有意义的。这允许与客户一起处理地址,例如,删除这两个。 –