【问题标题】:Database DAO that deals with collections (Java)处理集合的数据库 DAO (Java)
【发布时间】:2013-09-18 16:58:25
【问题描述】:

我似乎找不到正确的措辞来搜索网络并得到正确的答案。因此,每次我有一个对象包含其他对象的集合时,我都会陷入思考如何设计关系的困境。

例如,一个非常基本的例子是..

所以,我有一个可以有多个地址的人。我知道让 PersonDAO 也创建地址并将它们放在 Person 对象中是不正确的,那么我将如何为 Person 对象使用一种方法 (listAll()) 但让它们也返回所有地址?

我希望这是有道理的,如果我需要澄清,请告诉我。

另外,我能在网上找到的唯一看起来有点准确的东西是使用 CollectionsDAO,但我不确定它是如何工作的,所以我把它扔到了红色。

【问题讨论】:

  • 搜索关系 - one-to-manymany-to-oneone-to-onemany-to-many
  • 谢谢,这正是我想要的。 “多对多 DAO”导致了我之前找不到的大量示例。

标签: java database uml dao


【解决方案1】:

一种解决方案是让 PersonDAO 调用 AddressDAO 以获取地址并将它们放入它返回的 Person 对象中。这将进入一个单独的 listFull() 方法或类似的东西。如果“地址”是“人员”的一部分,我不知道 PersonDAO 对象也知道如何用地址记录填充 Person 实例在概念上是错误的。并且让 PersonDAO 调用 AddressDAO 来进行实际的数据访问似乎提供了良好的关注点分离(每个 DAO 访问它自己的表并委托给需要获取更多数据以返回更复杂结果的其他 DAO)。

正如@Thieson 所暗示的那样,您必须问自己为什么要费心去推导。如果您确实希望在它们之间继承和重用某些功能,那很好。但否则可能没有意义。我见过许多具有大量对象的系统,其中各个 DAO 对象之间没有直接的层次结构(例如broadleaf)。

您可能会在这里得到几个答案,告诉您只需做最有意义的事情,这绝对是个好建议。

【讨论】:

  • 这两个答案都很棒,我很想给第一个答案检查,因为它是第一个,而且两个答案几乎相同。但是,我喜欢您的回答特别建议在 PersonDAO 中使用 AddressDAO 来保持关注点分离的事实。我不确定为什么我没有想到这一点,但我认为它会很好,因为我确实希望能够自己列出地址,但也可以在填充地址时列出 Persons。我要达到的关键点是我仍然具有良好的凝聚力,但仍能获得我想要的结果。
【解决方案2】:

您不必在 DAO 上遵循实体关系架构。

您可以简单地添加一个名为 listAllWithAddress 的方法,例如,在 PersonDAO 中或创建一个名为 PersonAddressDAO 的单独 DAO 来表示它们的关系。

这方面没有规则,只有你自己的判断力。

不管您关于不添加该方法的评论,我都会在 PersonDAO 中添加该方法,因为无论如何它都会返回给我 Person 实体,即使地址已填充。

我给你的建议是,要多考虑是否有意义,而不是遵守限制性规则

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2012-01-10
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多