Допустим, у меня есть следующий агрегатный Root:Сохранение Совокупные Roots, не подвергая Вложенные сущности
class Order {
private Collection<OrderItem> items;
...
public void updateQuantity(int itemId, int quantity) { ... }
}
И давайте говорить, что я использовать простой SQL упорствовать его. Возникает вопрос: как я сохраняю ордер и его элементы, не подвергая коллекцию? Я вижу несколько способов, которые мне не нравятся:
1) Добавьте метод, который возвращает скопированную коллекцию. Мне это не нравится, потому что нам нужно делать копии каждого элемента (так как это Entity и может быть изменено), что является еще одной проблемой самостоятельно.
2) Добавить добытчиками для каждого свойства элементов:
class Order {
public int getQuantity(int itemId) { ... }
}
Это лучше, так как никто не извне, не может изменить вложенные объекты в суперпользователя. Но он может взорвать класс корня кучками манекенов.
3) Используйте путь Hibernate: получите элементы через отражение java в репозитории. Это жульничество". Также я думаю о том, как создать DTO, поэтому мне нужен законный способ прочитать значения.
4) Сделайте поле для использования модификатора по умолчанию и поместите реализацию репозитория (и ассемблер DTO) в тот же пакет, чтобы он имел доступ к полям. Не нравится, потому что реализация репозитория не является частью домена.
Я предпочитаю второй подход, но может быть какой-то другой способ, который мне не хватает?
Последнее, что я сейчас пойду. Благодаря! –
BTW, OrderItem изменен, но я хочу, чтобы он был изменен только через корень. –
Это нормально, что он изменен, но модификаторы доступа могут ограничивать его для своих клиентов в других слоях (например, презентация) –