Как импортировать исходные данные в базу данных с помощью Hibernate?
при развертывании приложений я часто использую возможности Hibernate для создания схемы базы данных, чтобы упростить развертывание. Это легко достижимо путем настройки hibernate.hbm2ddl.свойство авто.
однако иногда мне также нужно вставить некоторые исходные данные в базу данных, например root user. Есть ли способ, которым я мог бы достичь этого через hibernate с какой-то загрузки текстового файла?
Я знаю, что я мог бы легко запрограммировать код, который будет делать это, но просто интересно, есть ли уже какая-то утилита, которая может помочь мне достичь того же с помощью конфигурации?
6 ответов:
Я нашел это, выполнив поиск по "Hibernate fixtures":
Hibernate создаст базу данных когда предприятие Завод менеджер создано (на самом деле, когда спящий режим Метод sessionFactory создается юридическое лицо фабрика-менеджер). Если файл именованный импорт.sql существует в корне путь к классу ('/импорта.в SQL') Hibernate будет выполнять SQL инструкции, прочитанные из файла после создание схемы базы данных. Важно помнить, что перед гибернацией создает схему это очищает его (удалить все таблицы, ограничения или любая другая база данных объект, который будет создан в процесс построения схемы).
Источник: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html
дайте ему попробовать и дайте нам знать, если это работает!
добавить возможность импорта.sql для пути к классу отлично работает, hbm2ddl проверяет, существует ли файл и выполняет его. Единственная дополнительная деталь заключается в том, что каждая команда sql должна быть в своей собственной строке, иначе она не будет выполнена.
Это будет работать только если
hbm2ddl.autoустановлено значениеcreateилиcreate-drop.
добавить свойство hibernate спящий режим.hbm2ddl.import_files в конфигурации Hibernate. Изменить режим гибернации.hbm2ddl.автоматическое свойство для создания. Добавить initial_data.каталог sql in / 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>Если вы не хотите добавлять свойство в конфигурацию hibernate, вы можете создать импорт файлов.sql in / classes directory и hibernate используют это по умолчанию если свойство hibernate.hbm2ddl.авто равна, чтобы создать
Почему
hbm2ddl.autoиhbm2ddl.import_filesсвойства зло(при неправильном использовании в качестве инструмента для управления изменениями базы данных)
как сказал в другом месте, используя
hibernate.hbm2ddl.autoиhibernate.hbm2ddl.import_filesдля управления изменениями базы данных есть некоторые серьезные недостатки:
- только структура может быть изменена. Существующие значения могут быть перезаписаны или - в худшем случае - просто отправлены в нирвану. Без такого инструмента, как liquibase или scriptella, у вас нет никаких ETL возможности.
- этот метод не имеет сделок. Как структура, так и операторы данных будут выполнены до того, как менеджер транзакций возьмет на себя управление. Допустим, у вас есть ошибка в операторе 42 из 256. Теперь ваша база данных находится в несогласованном состоянии.
- Imvho, вы теряете прозрачность и контроль: где сценарий scriptella или набор изменений liquibase или обычно совершенное вместе с изменениями в моделях домена, Вы делаете изменение в модели домена и надеетесь (в основном), что hibernate узнает, что делать. (Это не так, но это совсем другая история.)
- для интеграции, системы и приемочных испытаний, вы просто предположим что ваши тестовые базы данных находятся в абсолютно, точно такое же состояние как ваша производственная база данных. Вы должны отслеживать это вручную (удачи и получайте удовольствие от этого! ;) ). В случае вы делаете ошибку, достаточно лишь небольшого промаха, результаты могут быть очень катастрофическими.
Я лично использую liquibase для управления изменениями базы данных и разработал следующий рабочий процесс, чтобы уменьшить работу по техническому обслуживанию:
- создать список из командной строки моей последней структуры выпуска
- создать список изменений моей последней базы данных
- вручную diff оба журнала изменений (обычно изменения не настолько велики, и если они есть, то они обычно отвечают одному из недостатков liquibases diff.
- создать набор изменений
даже для сложных изменений, в которых нужно реализовать customChange, это может быть достигнуто в течение нескольких часов, включая определение откатов, тестирование и документирование. Для тривиальных изменений это дело нескольких минут. В принципе: вы должны сделать немного больше работа (я создал индивидуальные наборы изменений для 4 конфигураций баз данных менее чем за день), но вы получаете спокойствие, что вы сделали все возможное, чтобы сохранить базу данных в согласованном состоянии.
через пару часов сбиваясь с этим, я решил поделиться тем, что я нашел, хотя это очень старый пост.
чтобы заставить его работать должным образом, я должен был сделать следующее:
- .sql в корне classpath; в моем случае, я просто положил его в
hbmddlзначениеcreateилиcreate-dropresourcesПапка, я использую maven.- каждая команда sql в одной строке
- каждый файл.sql должен иметь пустую строку в начале файл ==> не знаю причину этого, но если я не вставить пустую строку, во время выполнения сервера говорит, что есть синтаксическая ошибка рядом с первым символом.
надеюсь, что это поможет.
пожалуйста, убедитесь, что ваш импорт.sql отформатирован правильно. Начните с одной инструкции вставки лайнера для тестирования.
Comments