Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Добавьте конфигурацию hibernate hibernate.hbm2ddl.import_files в конфигурацию спящего режима. Измените свойство 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 использовать это по умолчанию, если свойство hibernate.hbm2ddl.auto равно созданию

Ответ 4

Почему свойства 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 diff.
  • создать набор изменений

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

Ответ 5

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

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

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

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

Ответ 6

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