Как импортировать исходные данные в базу данных с помощью Hibernate?
-
21-08-2019 - |
Вопрос
При развертывании приложений я часто использую возможности Hibernate для создания схемы базы данных, чтобы упростить развертывание.Это легко достижимо путем настройки свойства hibernate.hbm2ddl.auto.
Однако иногда мне также нужно вставить некоторые исходные данные в базу данных, например root user.Есть ли способ, которым я мог бы достичь этого через гибернацию с помощью какого-нибудь загружаемого текстового файла?
Я знаю, что мог бы легко запрограммировать код, который будет это делать, но просто интересно, есть ли уже какая-нибудь утилита, которая может помочь мне достичь того же с помощью конфигурации?
Решение
Я нашел это, выполнив поиск в разделе "Устройства гибернации". :
Hibernate создаст базу данных когда фабрика entity manager будет создана (фактически, когда Hibernate SessionFactory создается фабрикой entity manager).Если файл с именем import.sql существует в корневом каталоге путь к классу ('/import.sql') Hibernate выполнит SQL инструкции, прочитанные из файла после создания схемы базы данных.Важно помнить, что прежде чем Hibernate создаст схему, он очищает ее (удаляет все таблицы, ограничения или любую другую базу данных объект, который будет создан в процессе построения схемы).
Источник: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html
Попробуйте и дайте нам знать, если это сработает!
Другие советы
Добавление import.sql в путь к классу отлично работает, hbm2ddl проверяет, существует ли файл, и выполняет его.Единственная дополнительная деталь заключается в том, что каждая команда sql должна находиться в своей отдельной строке, иначе она не сможет быть выполнена.
Это также будет работать только в том случае, если hbm2ddl.auto
установлено значение create
или create-drop
.
Добавить свойство гибернации переход в спящий режим.hbm2ddl.импорт_файлов в вашей конфигурации гибернации.Измените свойство hibernate.hbm2ddl.auto для создания.Добавьте initial_data.sql в каталог /classes с исходным кодом sql для вставки данных.Hibernate выполните это после создания схемы базы данных.
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
</props>
</property>
</bean>
Если вы не хотите добавлять свойство в свою конфигурацию гибернации, вы можете создать файл import.sql в каталоге /classes и в режиме гибернации использовать это по умолчанию, если свойство hibernate.hbm2ddl.auto равно create
Почему hbm2ddl.auto
и hbm2ddl.import_files
свойства являются зло
(При неправильном использовании в качестве инструмента для управления изменениями базы данных)
Как сказано в другом месте, используя hibernate.hbm2ddl.auto
и hibernate.hbm2ddl.import_files
для управления изменениями базы данных есть некоторые серьезный недостатки:
- Изменить можно только структуру.Существующие значения могут быть перезаписаны или - в худшем случае - просто отправлены в Nirvana.Без такого инструмента, как ликвидационная база или скриптелла, у вас нет никаких ETL возможности.
- Этот метод не имеет транзакций.Как инструкции structure, так и инструкции data будут выполнены до того, как менеджер транзакций возьмет управление на себя.Допустим, у вас ошибка в операторе 42 из 256.Ваша база данных сейчас находится в несогласованном состоянии.
- Имвхо, вы теряете прозрачность и контроль:там, где изменения в скрипте scriptella или liquibase устанавливаются или обычно фиксируются вместе с изменениями в моделях домена, вы вносите изменения в модель домена и надеетесь (в основном), что hibernate выяснит, что делать.(Это не так, но это уже совсем другая история.)
- Для интеграции, системного и приемочного тестирования вы просто предполагать что ваши тестовые базы данных находятся в абсолютно, точно такое же состояние в качестве вашей производственной базы данных.Вы должны отслеживать это вручную (Удачи и получайте удовольствие от этого!;) ).В случае, если вы допустите ошибку, достаточно небольшого промаха, результаты могут оказаться катастрофическими.
Я лично использую liquibase для управления изменениями базы данных и разработал следующий рабочий процесс, чтобы сократить время обслуживания:
- Создайте список изменений из командной строки из моего последнего релиза structure
- Создайте список изменений моей последней базы данных
- Вручную различать оба журнала изменений (обычно изменения не такие уж большие, а если и есть, то они обычно соответствуют одному из недостатков разница в ликвидных базах команда.
- создайте набор изменений
Даже для сложных изменений, в которых необходимо внедрить Пользовательское изменение, это может быть достигнуто за считанные часы, включая определение откатов, тестирование и документирование.Для тривиальных изменений это вопрос нескольких минут.В основном:вам придется проделать немного больше работы (я создал индивидуальные наборы изменений для 4 конфигураций базы данных менее чем за день), но вы получаете душевное спокойствие от того, что сделали все возможное для поддержания базы данных в согласованном состоянии.
Поразмыслив над этим пару часов, я решил поделиться тем, что нашел, хотя это очень старый пост.
Чтобы заставить его работать должным образом, я должен был сделать следующее:
hbmddl
установить наcreate
илиcreate-drop
- файл.sql в корневом каталоге classpath;в моем случае я просто вставил его в
resources
папка, я использую maven. - каждая команда sql в одной строке
- каждый file.sql должен содержать пустую строку в начале файла ==> не знаю причины этого, но если я не вставлю эту пустую строку, во время выполнения серверы сообщат мне, что рядом с первым символом произошла синтаксическая ошибка.
Надеюсь, это поможет.
Пожалуйста, убедитесь, что ваш import.sql отформатирован правильно.Начните с однострочной инструкции insert для тестирования.