Является ли Hibernate Entity такой же, как модели домена?
Не совсем, нет.На практике грань между ними может быть очень размытой.
Одно из требований проектирования, управляемого доменом, заключается в том, что вы можете отделить проблемы постоянства от модели вашего домена.Модель предметной области хранит в памяти представления текущего состояния некоторого бизнеса и правила домена, которые управляют тем, как это бизнес-состояние изменяется со временем.
Хранилище действует как своего рода граница между частями вашего приложения, которые считают, что все доменные объекты хранятся где-то в локальной памяти, и частями кода, которые знают о энергонезависимом хранении данных.
Другими словами, хранилище - это (в некотором смысле) две функции;один знает, как извлечь данные из «агрегата» и хранилища, другой знает, как считывать данные из хранилища и создавать из него агрегат.
ORM - это один из способов получения данных извнешняя реляционная база данных в локальную память.
Таким образом, ваша история загрузки может выглядеть как
Use an identifier to load data from the database into a hibernate entity
copy the data from the hibernate entity into an aggregate
return the aggregate
А хранилище может выглядеть как
Copy data from the aggregate into a hibernate entity
Save the hibernate entity.
На практике это своего родаболь.Представлению ORM часто приходится беспокоиться о таких вещах, как суррогатные ключи, отслеживание грязных элементов данных, чтобы оно могло оптимизировать записи, и т. Д.
Вместо этого вы часто будете видеть, что логика домена заканчиваетсязаписывается в сущности ORM, и вы добавляете кучу комментариев, чтобы прояснить, какие биты присутствуют, потому что они требуются hibernate.
Если вы посмотрите на DDD Cargo shipping Например, вы увидите, что они выбрали этот второй подход, в котором агрегат имеет небольшую поддержку гибернации , скрытую внизу.
Домен и сущность - это разные функции.Модель предметной области «имеет-сущность»
Ваши коллеги правы: они эквивалентны в большинстве важных аспектов.Модель предметной области зависит от ваших спящих сущностей.
Ни один из них не соответствует тому, что Эванс описал в своей книге.
Обе они выглядят так, как многие команды проделали на практике .Как я могу сказать, использование доменной логики непосредственно в спящем объекте является обычным подходом.
Если бы вы на самом деле разделяли их, то ваш репозиторий выглядел бы примерно так:
Agent AgentRepository::find(id) {
AgentEntity e = entityManager.find(id)
Agent a = domainFactory.create( /* args extracted from e */ )
return a
}
void AgentRepository::store(Agent a)
AgentEntity e = entityManager.find(id)
copy(a, e)
}
// I think this is equivalent
void AgentRepository::store(Agent a)
AgentEntity e = entityManager.find(id)
entityManager.detach(e)
copy(a, e)
entityManager.merge(e)
}
Если вы посмотрите внимательно, вы увидите, что модель домена не зависит от модели гибернации, но хранилище зависит от обоих.Если вам нужно изменить свою стратегию персистентности, модель предметной области не изменится.
Стоит ли дополнительная степень разделения?Это зависит.Существует сильный когнитивный диссонанс между объектно-ориентированными шаблонами, используемыми для описания моделей предметной области, и сред без исполнения сред выполнения.