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

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

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

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


person Dan    schedule 23.03.2009    source источник


Ответы (7)


Я нашел это, выполнив поиск по «приборам Hibernate»:

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

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

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

person Matt Sidesinger    schedule 23.03.2009
comment
из того, что я вижу, sql не кажется независимым от БД - person Dan; 24.03.2009
comment
+! для import.sql должен быть в корне, а не где-нибудь - person Eyad Ebrahim; 10.04.2014

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

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

person Mauro De Lucca    schedule 29.05.2009
comment
Это также работает, только если для hbm2ddl.auto установлено значение create или create-drop. - person amorfis; 11.02.2011
comment
Этот комментарий был действительно полезен для меня. - person Marcin Cylke; 24.03.2011
comment
Требование помещать каждый оператор sql в отдельную строку является странным. Спасибо, что указали на это - person Tahir Akhtar; 10.02.2016
comment
Вы можете включить многострочные команды sql, добавив <property name="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</property> к вашему hibernate.cfg.xml (stackoverflow.com/a/15090964) - person cooljeffro; 16.08.2019

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

person punseti    schedule 08.07.2013

Почему свойства hbm2ddl.auto и hbm2ddl.import_files вредны

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

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

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

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

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

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

person Markus W Mahlberg    schedule 22.03.2014
comment
Liquibase великолепна, и для продукта, который несколько устоялся и разрабатывается командой, это отличная идея. С другой стороны, если вы разработчик-одиночка, создаете прототип, уточняете основы или иным образом исследуете что-то, что будет очень сильно меняться, возможность быстро заставить это работать за секунды, а не за минуты или часы при развертывании, весьма ценна. Как правило, когда появляется набор данных QA или, конечно, к тому времени, когда у вас есть производственные данные, hbm2ddl.auto следует удалить. Глупо говорить, что и то, и другое — зло. - person Gus; 13.06.2016
comment
@Gus Нет ничего более определенного, чем временное ;) И что-то, что вы, кажется, действительно упустили из виду (при неправильном использовании в качестве инструмента для управления изменениями в базе данных) В вопросе четко говорится, что мы говорят о развертывании, и, следовательно, управление изменениями БД является здесь контекстом. И я поддерживаю свое утверждение: для развертывания оба являются откровенным злом. Кстати, даже будучи единственным разработчиком, Liquibase больше не работает. В долгосрочной перспективе меньше. - person Markus W Mahlberg; 14.06.2016
comment
Это глупо и довольно бесполезно. Для простых автоматизированных тестов hbm2ddl вполне подходит большинству людей. - person Gavin King; 31.07.2020
comment
Хорошо, и как вы убедитесь, что ваша производственная установка будет перенесена в вашу настройку разработки? Стрелять и молиться? - person Markus W Mahlberg; 31.07.2020
comment
Вы назвали полезным инструментом я написал, что сотни тысяч людей успешно используют уже почти два десятилетия зла. То, что это не универсальное решение всех проблем в управлении данными, не делает его злом. - person Gavin King; 01.08.2020
comment
Кажется, вы пропустили часть: (при неправильном использовании в качестве инструмента для управления изменениями базы данных). Его нельзя использовать для этого без серьезных недостатков, как изложено. - person Markus W Mahlberg; 02.08.2020

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

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

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

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

person jomar    schedule 03.09.2015
comment
First-Line-Issue звучит как BOM - person dtrunk; 06.09.2015
comment
Я думаю, вы имеете в виду import.sql, а не file.sql. - person Koray Tugay; 27.05.2017
comment
Под файлом.sql я имел в виду любой файл *.sql, независимо от имени, если вы укажете его в файле сохранения. import.sql — это имя файла, импортируемого по умолчанию (если он есть) без необходимости указывать его в файле сохраняемости. - person jomar; 29.05.2017

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

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

person Gavin King    schedule 31.07.2020

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

person Ninja420    schedule 21.09.2018