如何建模两个聚合根之间的关系

时间:2012-02-21 20:32:09

标签: java jpa domain-driven-design

我有一个名为Question的班级,另一个名为StudentDriver的班级。 StudentDriver有一个问题列表。由于这两个类都是聚合根,因此它们拥有自己的存储库。

当我要添加一个新问题时,StudentDriver类应该有一个名为addQuestion()?的方法吗?我是否会通过studentdriver存储库合并studentdriver对象,或者我是否会坚持使用问题库?如果我将其与问题库保持一致,则属于studentdriver的问题列表将不包含新添加的问题,直到我从数据库刷新它。

我不理解两个聚合根对象之间的连接以及我将如何正确建模它。

我正在使用JPA。

1 个答案:

答案 0 :(得分:4)

看起来你有两个选择:

1)两个聚合根。添加新问题看起来像这样:

StudentDriver student = studentsRepository.findById(id);
Question question = someFactory.CreateForStudent(student);
questionsRepository.Persist(question);

为学生提出所有问题将是问题库的责任:

IList<Question> studentQuestions = questionsRepository.findByStudent(student);

基本上,你有一个从问题到学生的持久单向关系:问题属于StudentDriver(多对一)。

2)一个聚合根。 StudentDriver是包含问题列表的聚合的根。添加新问题看起来像这样:

StudentDriver student = studentsRepository.findById(id);
student.addNewQuestion("Should you stop on a red light?", "Yes");
studentsRepository.Persist(student);

要获得学生的所有问题,您可以使用以下内容:

IList<Question> studentQuestions = student.GetAllQuestions();

两个选项之间的选择取决于OP中缺少的信息。识别聚合根的好方法是查看生命周期逻辑。像

这样的问题
  • 没有相应的学生可以存在问题吗?
  • 可以将问题从一个学生“重新分配”到另一个学生吗?
  • 删除/存档学生时,是否还应删除所有问题?