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

При развертывании приложений я часто использую возможности Hibernate для создания схемы базы данных, чтобы упростить развертывание. Этого легко достичь, настроив свойство hibernate.hbm2ddl.auto.

Однако иногда мне также нужно вставить некоторые исходные данные в базу данных, например, пользователь root. Есть ли способ, которым я мог бы достичь этого через спящий режим с какой-то загрузки текстового файла?

Я знаю, что мог бы легко запрограммировать код, который будет это делать, но мне просто интересно, есть ли уже какая-нибудь утилита, которая может помочь мне добиться того же с помощью конфигурации?

6 ответов

Решение

Я нашел это, выполнив поиск по "Hibernate fixtures":

Hibernate создаст базу данных, когда будет создана фабрика диспетчера сущностей (фактически, когда SiberFactory Hibernate создается фабрикой диспетчера сущностей). Если файл с именем 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,

Добавьте свойство hibernate hibernate.hbm2ddl.import_files в свою конфигурацию hibernate. Измените свойство 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 равно созданию

Зачем hbm2ddl.auto а также hbm2ddl.import_files свойства злые

(При неправильном использовании в качестве инструмента для управления изменениями базы данных)

Как сказано в другом месте, используя hibernate.hbm2ddl.auto а также hibernate.hbm2ddl.import_files Для управления изменениями базы данных есть несколько серьезных недостатков:

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

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

  • Создать список изменений из командной строки моей последней структуры выпуска
  • Создать журнал изменений моей последней базы данных
  • Дифференцируйте оба журнала изменений вручную (обычно изменения не так уж велики, и, если они есть, они обычно встречаются с одним из недостатков команды diff в liquibases).
  • создать набор изменений

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

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

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

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

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

Стандартный способ сделать это в JPA - использовать свойство конфигурации javax.persistence.sql-load-script-source.

Вы можете изучить различные настройки, связанные с экспортом схемы и импортом тестовых данных, перечисленные в Hibernate. AvailableSettings класс.

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

Другие вопросы по тегам