Я думаю, что решение сводится к «жизненному циклу» и несоответствию импеданса между жизненными циклами.
Жизненный цикл: Каждый фрагмент данных, будь то его исходный код, строка базы данных, скомпилированный класс, объект, имеет связанный с ним жизненный цикл. Когда он появляется и когда собирается мусор?
Предположим, я поместил аннотации Hibernate в класс Java. Кажется разумной идеей, особенно если я создаю новую базу данных с нуля и уверен, что только одно это приложение будет когда-либо подключаться к ней - жизненные циклы моих классов, схема базы данных и отображение ORM естественно синхронизированы.
Теперь предположим, что я хочу использовать тот же класс в API и передать его третьему лицу для использования. Аннотации Hibernate просачиваются в мой API. Это происходит потому, что жизненный цикл этого класса и базы данных не одно и то же. Поэтому мы используем инструменты отображения для преобразования между слоями компонентов в системе.
Я стараюсь думать о жизненных циклах, и следует избегать аннотаций, которые могут привести к несоответствиям жизненного цикла. Некоторые аннотации в этом отношении относительно безвредны, а некоторые представляют собой скрытую опасность.
Примеры неправильных аннотаций: Отображение ORM, конфигурация базы данных, жестко заданная конфигурация для элементов, которые могут различаться в зависимости от среды развертывания, проверки, которые могут различаться в зависимости от контекста.
Примеры безобидных аннотаций: Определения конечных точек REST, сериализация JSON / XML, проверки, которые всегда применяются.