2012-02-21 139 views
1

我有一個類名爲Question,另一個名爲StudentDriverStudentDriver有一個問題清單。由於這兩個類都是聚合根,所以他們有自己的存儲庫。如何建模兩個聚合根之間的關係

當我要添加一個新問題時,StudentDriver類應該有一個名爲addQuestion()?的方法嗎?我是否會通過studentdriver存儲庫合併studentdriver對象,還是我會用問題存儲庫持久保存問題?如果我堅持使用問題庫,那麼屬於學生驅動程序的問題列表將不會包含新添加的問題,除非我從數據庫中刷新它。

我不明白兩個聚合根對象之間的連接以及我如何正確建模。

我正在使用JPA。

+0

爲什麼不根據用戶界面需求或外部API必須提供的內容實現需要實現的內容?您是否知道您在事務中所做的操作無論如何都不可見於其他併發事務,並且每個新事務都從頭開始,並從數據庫中加載所有事務。 – 2012-02-21 22:44:12

回答

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缺少信息。識別聚合根的好方法是查看生命週期邏輯。像

  • 問題存在沒有相應的學生?
  • 問題可以從一個學生重新分配給另一個學生嗎?
  • 當您刪除/存檔學生時,是否應刪除所有問題?
+0

謝謝Dmitry – LuckyLuke 2012-02-22 07:06:53

+0

如果我的StudentDriver必須有實際的問題ID列表(對於一些不應使用存儲庫的複雜業務邏輯),該怎麼辦? (都是獨立的AR) – EwanCoder 2017-05-11 21:42:05

相關問題