Я хочу настроить мою базу данных с начальными данными программно. Я хочу заполнить свою базу данных для прогонов разработки, а не для тестов (это легко). Продукт построен на основе Spring и JPA / Hibernate.
- Разработчик проверяет проект
- Разработчик запускает команду / скрипт для настройки базы данных с исходными данными
- Разработчик запускает приложение (сервер) и начинает разработку / тестирование
тогда:
- Разработчик запускает команду / скрипт для очистки базы данных и установки новых исходных данных, поскольку структуры базы данных или начальный комплект данных были изменены
То, что я хочу, это настроить мою среду по необходимым частям, чтобы вызывать мои DAO и вставлять новые объекты в базу данных. Я не хочу создавать исходные наборы данных в сыром SQL, XML, делать дампы базы данных или что-то еще. Я хочу программно создавать объекты и сохранять их в базе данных, как в обычной логике приложения.
Один из способов сделать это - нормально запустить мое приложение и запустить специальный сервлет, который выполняет инициализацию. Но так ли это на самом деле? Я хотел бы выполнить первоначальную настройку данных как задачу Maven, и я не знаю, как это сделать, если я использую сервлетный подход.
Есть несколько похожий вопрос . Я бросил быстрый взгляд на предлагаемые DBUnit и Unitils. Но они, кажется, сильно сосредоточены на настройке сред тестирования, а это не то, что я хочу здесь. DBUnit выполняет начальную загрузку данных, но только с использованием фикстур xml / csv, а это не то, что мне нужно. Затем у Maven есть плагин SQL, но я не хочу обрабатывать сырой SQL. В Maven также есть плагин Hibernate, но, похоже, он помогает только в настройке Hibernate и создании схем таблиц (не в заполнении БД данными).
Как это сделать?
Частичное решение 2010-03-19
Предлагаемые альтернативы:
- Использование модульных тестов для заполнения базы данных # 2423663
- Использование ServletContextListener для получения контроля при запуске веб-контекста # 2424943 и # 2423874
- Использование Spring ApplicationListener и стандартных и пользовательских событий Spring # 2423874
Я реализовал это с помощью SpringL 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 генерирует новую схему. Поскольку БД тогда тоже пустая.