Можно ли использовать бизнес-объекты гибернации как объекты в чистой архитектуре?
В нашем проекте мы используем классы, сгенерированные плагином eclipse hibernate для сохранения. Сгенерированные классы имеют следующую структуру.
MyClass extends BaseMyClass //POJO's, that are refenced in the hbm
files
MyClassDAO extends BaseMyClassDAO //DAO objects that use hibernate
session objects to provide CRUD API's for working with DB
Мой вопрос заключается в том, нарушит ли это чистую архитектуру дяди Бобса, если мы будем использовать классы POJO, используемые в файлах сопоставления, в качестве сущностей в самом внутреннем слое.
В этом случае специфичные для режима гибернации классы DAO будут принадлежать к самому внешнему уровню, а уровень UseCases будет взаимодействовать с этим уровнем посредством предоставления интерфейса, который будет реализован.
Заранее спасибо.
1 ответ
Дядя Боб комментирует это во время лекции в Норвегии, представляя этот слайд:
Дядя Боб говорит:
Над чертой нет Hibernate. Если вы используете Hibernate, он идет ниже линии. Приложение не знает, что вы используете эту структуру. Он идет ниже линии. И Hibernate - прекрасный инструмент. Это очень хорошо для сбора данных из базы данных и преобразования их в структуры данных. Очень хорошо! Но вы не хотите, чтобы ваше приложение знало, что вы его используете. Вы кладете все это ниже черты.
Роберт К. Мартин - Чистая архитектура, NDC 2012 (53:53 - 54:18)
Таким образом, если вы используете аннотации Hibernate для сущностей, вы смешиваете объекты домена с деталями уровня базы данных.
Некоторые разработчики утверждают, что аннотации не являются настолько сильными зависимостями, потому что, если они недоступны во время выполнения, они просто не существуют. Это правда, но вы должны учитывать и другие принципы.
Если вы поместите аннотации Hibernate в свои сущности, классы сущностей теперь имеют две разные причины для изменения: логику домена и отображение базы данных. Это нарушение принципа единой ответственности . И я надеюсь, что вы не хотите, чтобы отображение базы данных влияло на объекты вашего домена.
Я думаю, здесь много путаницы из-за перегруженного термина entity . Когда дядя Боб говорит о сущностях, он имеет в виду область. В Hibernate сущность означает запись в базе данных.
Вот почему я обычно различаю их, используя термин «объект домена» или «объект базы данных».