【问题标题】:DAO. Many-to-many relationship道。多对多关系
【发布时间】:2013-01-20 05:25:56
【问题描述】:

使用DAO模式时如何处理多对多关系? DAO 是否负责使用 3-rd Link 表链接两个实体?例如,我有 2 个实体:CustomerProduct

而且我需要提供如下方法:

public void assignCustomerToProduct(...);
public List<Product> getSelledProducts(long customerId);

此方法需要使用 3-rd table 作为 Linkage table。 CustomerDao 负责提供这个方法吗?或者最好将此方法排除在服务层中?

【问题讨论】:

  • 顺便说一句,我们没有英文的“Selled”。也许,您的意思是“已售出”;)

标签: java oop repository-pattern dao


【解决方案1】:

其中一个对象应该拥有该关系。因此,例如,只有在您保存 Employee 时才会保存职位。

如果你这样做,那么 Employee 就会(有点)像聚合根(如果你在谈论 DDD 存储库)。然后,存储库负责根据需要创建位置并在链接表中插入多对多条目。

如果 Position 本身是一个聚合根,那么 EmployeeRepository 只负责更新链接表,而不负责持久化 Positions。

【讨论】:

  • 抱歉,我没有使用任何存储库模式。有人编辑了我的问题并添加了repository-pattern 标签。实际上,我使用only DAO 模式,甚至更多我不知道什么是存储库模式以及如何使用它。我的问题符合DAO模式。或者更特别 - GenericDAO。附言我使用 JDBC。 ...如果您可以提供存储库模式优于 DAO 的一些优势,以及为什么我使用存储库而不是 DAO 更好,我准备更改我的代码:)
  • 它们非常相似,但是 Repository 与域驱动设计 (DDD) 一起使用,并且它对它应该做什么有一些限制。我认为我上面写的大部分内容仍然适用。例如,您的 EmployeeDAO 可以负责存储 Employee 以及员工和职位之间的链接表中的行。有一个真正的双向关系,其中存储任何一个都会将某些内容持久化到链接表中需要大量工作,而且可能不值得。
  • If Position is an aggregate root itself, then the EmployeeRepository is only responsible for updating the link table, but is not responsible for persisting Positions. 所以有我在EmployyDAO里面提到的方法也不错?
  • 那种。 EmployeeDAO 应该在您想要保存 Employee 时更新链接表。这并不意味着 DAO 将有一种方法来在链接表中插入一行。这样,您的应用程序是正确的 OO 并且您如何持久化数据是一个细节。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2018-06-15
  • 2014-10-11
相关资源
最近更新 更多