道。多对多关系

Posted

技术标签:

【中文标题】道。多对多关系【英文标题】: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”。也许,您的意思是“已售出”;) 【参考方案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 并且您如何持久化数据是一个细节。

以上是关于道。多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

具有额外多对多关系的 JPA 多对多

雄辩的多对多对多 - 如何轻松加载远距离关系

Hibernate学习笔记 — 多对多关系映射

Django:通过另一个多对多关系访问多对多对象

多对多关系

多对多manytomany