DAO. 多对多关系

5

在使用DAO模式时,如何处理多对多关系?DAO是否负责使用第三个链接表将两个实体进行关联?例如,我有两个实体:客户产品

我需要提供以下方法:

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

这个方法需要使用第三张表作为链接表。 CustomerDao 应该负责提供这个方法吗?还是将这些方法排除在服务层之外更好?


顺便说一下,在英语中没有“Selled”这个词。也许你的意思是“Sold” ;) - Afshin Moazami
1个回答

2

其中一个对象应该拥有这个关系。例如,只有在保存雇员时才会保存职位。

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

如果Position本身是一个聚合根,则EmployeeRepository仅负责更新链接表,但不负责持久化Position。


抱歉,我不使用任何存储库模式。有人编辑了我的问题并添加了“repository-pattern”标签。实际上,我仅使用DAO模式,而且我不知道什么是Repository模式以及如何使用它。我的问题符合DAO模式。更具体地说是“GenericDAO”。附言:我使用JDBC。如果您能提供一些关于Repository模式优于DAO的优势以及为什么最好使用Repository而不是DAO的原因,我愿意改变我的代码 :) - WelcomeTo
它们非常相似,但Repository与领域驱动设计(DDD)一起使用,并且对其应该执行的操作有一些限制。我认为我上面写的大部分仍然适用。例如,您的EmployeeDAO可以负责存储Employee和员工与职位之间链接表中的行。拥有真正的双向关系,在存储任何一个实体时都会将某些内容持久化到链接表中,这需要很多工作,可能不值得。 - Augusto
如果Position本身是一个聚合根,那么EmployeeRepository只负责更新链接表,而不负责持久化Positions。那我提到的在EmployyDAO内部有这样的方法也没有问题吧? - WelcomeTo
有点。每当您想保存员工时,EmployeeDAO 应该更新链接表。这并不意味着 DAO 将具有仅在链接表中插入行的方法。通过这种方式,您的应用程序是正确的面向对象的,如何持久化数据是一个细节。 - Augusto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接