Я хочу программно настроить мою базу данных с исходными данными. Я хочу заполнить свою базу данных для прогонов разработки, а не для пробных запусков (это легко). Продукт построен поверх Spring и JPA/Hibernate.
- Разработчик проверяет проект
- Разработчик запускает команду / script для настройки базы данных с исходными данными
- Разработчик запускает приложение (сервер) и начинает разработку/тестирование
то
- Разработчик запускает команду / script, чтобы очистить базу данных и настроить ее новыми исходными данными, поскольку были изменены структуры баз данных или исходный набор данных.
Я хочу настроить свою среду по необходимым частям, чтобы вызвать мои DAO и вставить новые объекты в базу данных. Я не хочу создавать исходные наборы данных в сыром SQL, XML, принимать дампы базы данных или что-то еще. Я хочу программно создавать объекты и сохранять их в базе данных, как и в обычной логике приложения.
Одним из способов добиться этого было бы запустить мое приложение в обычном режиме и запустить специальный сервлет, который выполняет инициализацию. Но действительно ли это путь? Я хотел бы выполнить начальную настройку данных как задачу Maven, и я не знаю, как это сделать, если я возьму подход сервлета.
Существует несколько схожий вопрос. Я быстро взглянул на предлагаемые DBUnit и Unitils. Но они, похоже, в большой степени сосредоточены на настройке тестовых сред, чего я здесь не хочу. DBUnit делает начальную совокупность данных, но только с использованием xml/csv fixtures, и это не то, что я здесь. Затем у Maven есть плагин SQL, но я не хочу обрабатывать raw SQL. У Maven также есть плагин Hibernate, но он, похоже, помогает только в конфигурации конфигурации Hibernate и схемы таблицы (а не в заполнении db данными).
Как это сделать?
Частичное решение 2010-03-19
Предлагаемые альтернативы:
- Использование модульных тестов для заполнения базы данных # 2423663
- Использование ServletContextListener для получения контроля над запуском веб-контекста # 2424943 и # 2423874
- Использование Spring ApplicationListener и Spring стандартных и пользовательских событий # 2423874
Я реализовал это с помощью Spring ApplicationListener:
Класс:
public class ApplicationContextListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
...check if database is already populated, if not, populate it...
}
}
}
applicationContext.xml:
<bean id="applicationContextListener" class="my.namespaces.ApplicationContextListener" />
По какой-то причине я не смог запустить ContextStartedEvent, поэтому я выбрал ContextRefreshedEvent, который запускается также при запуске (еще не наткнулся на другие ситуации).
Как очистить базу данных? В настоящее время я просто удаляю артефакты HSQLDB, а новая схема генерируется при запуске Hibernate. Так как DB также пуст.