2012-02-21 3 views
1

У меня есть один класс с именем Question и другой по имени StudentDriver. StudentDriver есть список вопросов. Поскольку оба класса являются совокупными корнями, у них есть свой собственный репозиторий.Как смоделировать взаимосвязь между двумя совокупными корнями

Когда я собираюсь добавить новый вопрос, если StudentDriver класса есть метод с именем addQuestion()? И я бы объединить объект studentdriver через хранилище studentdriver, или я упорствовать вопрос с репозиторием вопроса? Если я сохраню его в репозитории вопросов, тогда список вопросов, принадлежащих ученику-ученику, не будет содержать вновь добавленный вопрос, пока я не обнов его из базы данных.

Я не понимаю связи между двумя совокупными корневыми объектами и тем, как я буду правильно ее моделировать.

Я использую JPA.

+0

Почему вы не реализуете то, что вам нужно реализовать на основе потребностей пользовательского интерфейса или того, что должен предоставить внешний API? Знаете ли вы, что то, что вы делаете в транзакции, в любом случае не видно из других параллельных транзакций и что каждая новая транзакция начинается с нуля и загружает все из базы данных. –

ответ

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(); 

Выбор между двумя вариантами зависит от информации, которая отсутствует в ОП , Хорошим способом определения совокупного корня является просмотр логики жизненного цикла. Вопросы, касающиеся

  • Может ли вопрос существовать без соответствующего студента?
  • Может ли вопрос «переназначить» от одного ученика к другому?
  • Когда вы удаляете/архивируете Студент, должны ли все вопросы также удаляться?
+0

Спасибо Dmitry – LuckyLuke

+0

Что делать, если мой StudentDriver должен иметь фактический список идентификаторов вопросов (для некоторой сложной бизнес-логики, которая не должна использовать репозиторий)? (оба являются отдельными AR) – EwanCoder