Как импортировать исходные данные в базу данных с помощью Hibernate?

StackOverflow https://stackoverflow.com/questions/673802

Вопрос

При развертывании приложений я часто использую возможности 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 для управления изменениями базы данных есть некоторые серьезный недостатки:

  1. Изменить можно только структуру.Существующие значения могут быть перезаписаны или - в худшем случае - просто отправлены в Nirvana.Без такого инструмента, как ликвидационная база или скриптелла, у вас нет никаких ETL возможности.
  2. Этот метод не имеет транзакций.Как инструкции structure, так и инструкции data будут выполнены до того, как менеджер транзакций возьмет управление на себя.Допустим, у вас ошибка в операторе 42 из 256.Ваша база данных сейчас находится в несогласованном состоянии.
  3. Имвхо, вы теряете прозрачность и контроль:там, где изменения в скрипте scriptella или liquibase устанавливаются или обычно фиксируются вместе с изменениями в моделях домена, вы вносите изменения в модель домена и надеетесь (в основном), что hibernate выяснит, что делать.(Это не так, но это уже совсем другая история.)
  4. Для интеграции, системного и приемочного тестирования вы просто предполагать что ваши тестовые базы данных находятся в абсолютно, точно такое же состояние в качестве вашей производственной базы данных.Вы должны отслеживать это вручную (Удачи и получайте удовольствие от этого!;) ).В случае, если вы допустите ошибку, достаточно небольшого промаха, результаты могут оказаться катастрофическими.

Я лично использую liquibase для управления изменениями базы данных и разработал следующий рабочий процесс, чтобы сократить время обслуживания:

Даже для сложных изменений, в которых необходимо внедрить Пользовательское изменение, это может быть достигнуто за считанные часы, включая определение откатов, тестирование и документирование.Для тривиальных изменений это вопрос нескольких минут.В основном:вам придется проделать немного больше работы (я создал индивидуальные наборы изменений для 4 конфигураций базы данных менее чем за день), но вы получаете душевное спокойствие от того, что сделали все возможное для поддержания базы данных в согласованном состоянии.

Поразмыслив над этим пару часов, я решил поделиться тем, что нашел, хотя это очень старый пост.

Чтобы заставить его работать должным образом, я должен был сделать следующее:

  • hbmddl установить на create или create-drop
  • файл.sql в корневом каталоге classpath;в моем случае я просто вставил его в resources папка, я использую maven.
  • каждая команда sql в одной строке
  • каждый file.sql должен содержать пустую строку в начале файла ==> не знаю причины этого, но если я не вставлю эту пустую строку, во время выполнения серверы сообщат мне, что рядом с первым символом произошла синтаксическая ошибка.

Надеюсь, это поможет.

Пожалуйста, убедитесь, что ваш import.sql отформатирован правильно.Начните с однострочной инструкции insert для тестирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top