Как импортировать исходные данные в базу данных с помощью Hibernate? - PullRequest
60 голосов
/ 23 марта 2009

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

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

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

Ответы [ 6 ]

81 голосов
/ 24 марта 2009

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

Hibernate создаст базу данных когда фабрика менеджера сущностей создано (на самом деле, когда Hibernate's SessionFactory создается управляющий предприятием завода). Если файл с именем import.sql существует в корне путь к классу ('/import.sql') Hibernate выполнит SQL Заявления читаются из файла после создание схемы базы данных. Важно помнить, что до того, как Hibernate создаст схему очищает его (удаляет все таблицы, ограничения или любая другая база данных объект, который будет создан в процесс построения схемы).

Источник: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html

Попробуйте и дайте нам знать, если это работает!

60 голосов
/ 30 мая 2009

Добавление import.sql в путь к классу работает отлично, hbm2ddl проверяет, существует ли файл, и выполняет его. Единственная дополнительная деталь - каждая команда sql должна находиться в отдельной строке, иначе она не будет выполнена.

Это также будет работать, только если hbm2ddl.auto установлено на create или create-drop.

42 голосов
/ 08 июля 2013

Добавить свойство 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 равно созданию

20 голосов
/ 22 марта 2014

Почему hbm2ddl.auto и hbm2ddl.import_files свойства злые

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

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

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

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

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

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

7 голосов
/ 03 сентября 2015

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

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

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

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

0 голосов
/ 21 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...