2012-02-21 21 views
1

Questionという名前のクラスとStudentDriverという名前のクラスがあります。 StudentDriverには質問のリストがあります。両方のクラスは集合ルートであるため、独自のリポジトリを持っています。2つの集約ルート間の関係をモデル化する方法

StudentDriverクラスには、addQuestion()?という名前のメソッドがありますか?また、studentdriverオブジェクトをstudentdriverリポジトリにマージするか、質問リポジトリに質問を残しますか?私が質問リポジトリでそれを保持すると、学生ドライバーに属する質問のリストには、データベースから更新するまで、新しく追加された質問は含まれません。

2つの集約ルートオブジェクト間の接続と、それを正しくモデル化する方法を理解できません。

私はJPAを使用しています。

1)二つの集計根:あなたは2つのオプションがありますように

+0

ユーザーインターフェイスのニーズや外部APIが提供しなければならないものに基づいて実装する必要があるものを実装しないのはなぜですか?トランザクション内でやることは、他の同時トランザクションからは見えず、新しいトランザクションはすべてゼロから開始し、データベースからすべてをロードすることに気付いていますか? –

答えて

4

が見えます。基本的にあなたが学生への質問から永続的な一方向の関係を持って

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

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

、学生のために、すべての質問を得ることが質問リポジトリの責任になります:新しい質問を追加すると、次のようになります。質問 - 所属 - 学生のドライバー(多対1)。

2)1つの集約ルート。 StudentDriverは、質問のリストを含む集約のルートです。新しい質問を追加すると、次のようになります。

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

あなたがのようなものを使用することになり、学生のためのすべての質問を取得するには:

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

2つのオプションの選択はOPから欠落している情報に依存します。集約ルートを特定する良い方法は、ライフサイクルロジックを調べることです。質問など

  • 対応する生徒がいない質問はありますか?
  • 質問がある学生から別の学生に「再割り当て」できますか?
  • Studentを削除/アーカイブする際に、すべての質問も削除する必要がありますか?
+0

ドミトリーありがとうございました – LuckyLuke

+0

私のStudentDriverが質問IDの実際のリストを持っている必要がある場合(リポジトリを使用すべきでない複雑なビジネスロジックの場合) (どちらも別個のARである) – EwanCoder

関連する問題