#java #hibernate #intellij-idea #nhibernate-mapping
#java #гибернация #intellij-idea #nhibernate-отображение
Вопрос:
Я создал модель домена и базы данных. Модель домена предназначена для rest api. Оба имеют схожие компоненты, такие как продукт, категория, клиент, продавец и т.д… Но если вы более внимательно посмотрите на обе модели. Вы можете увидеть некоторые различия. Например, вы можете видеть, что в модели базы данных у продавца есть несколько продуктов. Но в модели домена вы можете видеть, что у каждого продукта есть один розничный продавец. Причина этого заключается в том, что мне нужно иметь возможность возвращать список из нескольких продуктов у разных розничных продавцов.
Вы также можете видеть в модели домена, что продукт имеет productproperties . В базе данных это также выполняется по-другому, чем в модели домена. Модель базы данных имеет столбец свойств (например: высота, вес, разрешение и т. Д.). В базе данных продукт имеет свойство productproperty, которое имеет значение и свойство.
Модель домена:
Модель / дизайн базы данных:
Я провел некоторое исследование в Hibernate и сделал тестовый проект, чтобы посмотреть, как работает это отображение. У меня работает простой проект. Но когда я начал создавать проект с этими моделями, я застрял. Я не мог найти способ заставить это работать.Я кое-что читал о «POJOs», поэтому, возможно, решением может быть создание pojos для базы данных, а затем сопоставление их с моделями моего домена, но я не уверен в этом. Итак, мой вопрос в том, как создать базу данных, подобную модели с моделью домена, с отображением гибернации?
PS: я знаю, что модель базы данных не полностью соответствует модели домена.
Ответ №1:
На этот вопрос нет простого ответа, потому что вы просите что-то вроде:
пожалуйста, сделайте эту работу.
Вы должны либо сгенерировать DDL из ваших классов hibernate java (сверху вниз), либо вы сгенерировали классы hibernate java из вашей схемы DB (снизу вверх).
Подход сверху вниз поддерживается hibertnate напрямую — просто Google для создания DDL с помощью hibernate.
Подход снизу вверх поддерживается IntelliJ IDEA. В этом блоге объясняется, как это можно сделать: https://jpdevelopment.blogspot.com/2015/11/create-entity-objects-from-db-schema.html
Я бы посоветовал вам следовать нисходящему подходу, потому что это независимый от инструментов и лучше поддерживается.
Разработка классов гибернации и схемы базы данных для разных целей приводит к проблемам с отображением, которые вы не хотите иметь.
Кроме того, вы говорите о своей domain
модели, которая используется для REST API. Я бы предположил, что вы используете свою модель класса hibernate java в качестве модели внутреннего домена — может быть, она не идеальна, но достаточно хороша. Модель класса REST API доступна для внешнего мира, и изменения в этой модели должны выполняться с осторожностью, потому что вы можете сломать некоторых своих потребителей при изменении этой модели.
Как вы должны продолжить?
Вы должны использовать подход сверху вниз. Создайте классы Java, максимально отражающие ваши диаграммы отношений сущностей, добавьте к ним аннотации гибернации, используйте drop-create
для удаления и повторного создания схемы при запуске (читать https://thorben-janssen.com/standardized-schema-generation-data-loading-jpa-2-1 /) и убедитесь, что приложение запустилось, создайте схему успешно как можно быстрее.
При таком подходе вы получаете немедленную обратную связь, если ваше сопоставление работает.
Более подробно: используйте модульные тесты для реальной базы данных, чтобы убедиться, что ваша модель гибернации работает должным образом.
Комментарии:
1. Большое спасибо за ответ. Я рассмотрю подход как сверху вниз, так и снизу вверх. Но какой из них вы бы предложили?
2. @dirk.z Смотрите документацию по гибернации:
Although the automatic schema generation is very useful for testing and prototyping purposes, in a production environment, it’s much more flexible to manage the schema using incremental migration scripts.
3. Обновленный ответ. И да, если вы собираетесь использовать автоматизированное производственное развертывание. Я бы предложил использовать flywaydb.org как инструмент миграции БД.
Ответ №2:
Для отображения гибернации вам следует использовать модели базы данных, поскольку эти модели напрямую сопоставляются с полями базы данных. Модели домена / POJO следует использовать в методах контроллера, которые также обеспечивают уровень безопасности, поскольку ваши API не будут затронуты, если вы решите изменить таблицу базы данных.
Комментарии:
1. Спасибо за ответ. Может быть, у вас есть пример того, как это сделать?