【问题标题】:Can a DAO call DAO?DAO 可以调用 DAO 吗?
【发布时间】:2012-02-17 18:48:13
【问题描述】:

我的组件需要更新客户和客户地址的数据库(通过 JDBC)。从 CustomerDAO 调用 CustomerAddressDAO 是否合适?或者创建一个单独的“CustomerDataManager”组件来分别调用它们?

【问题讨论】:

  • 是什么阻止您在业务层执行此操作?

标签: dao naming


【解决方案1】:

可以这样做,但这并不意味着你应该这样做。在这些情况下,我喜欢使用一个服务(在这种情况下为CustomerService),它有一个使用两个 DAO 的方法调用。您可以围绕服务方法定义事务,因此如果一个调用失败,它们都会回滚。

DAO 调用其他 DAO 的问题是您很快就会得到循环引用。依赖注入变得更加困难。

【讨论】:

    【解决方案2】:

    显然,您可以通过不同的方式进行操作。但是,要正确回答这个问题,您应该从您的模型开始。在模型中,查看 Address 是实体(具有自己的 id 并且也独立使用的东西),还是值类型(仅在客户的上下文中才有意义的东西。然后,您将有两种情况:

    1. 地址是一个实体: 在这种情况下,Address 有自己的 Dao,而 Customer 有自己的 Dao。两道都不应该访问另一道。如果有一些逻辑需要操作这两者,那么它必须在您的应用程序逻辑中,而不是在数据访问层中。

    2. Address 是与 Customer 关联的值类型: 在这种情况下,地址本身没有单独的 DAO。它作为包含 Customer 对象的一部分被保存/恢复。

    结论:如果设计得当,DAO 不会相互访问(在标准情况下)。

    【讨论】:

    • “如果有一些逻辑需要操纵这两者,那么它必须在您的应用程序逻辑中,而不是在数据访问层中。” -- 如果它需要是事务性的怎么办? (例如,我需要确保同时删除客户和地址)
    • 这是一个非常好的问题!我认为,在这种情况下,将地址作为与客户关联的值类型是有意义的。这允许与客户一起操纵地址,例如删除两者。
    猜你喜欢
    • 2019-07-31
    • 2015-02-24
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2016-01-04
    • 2018-05-02
    相关资源
    最近更新 更多