Как заполнить Java (веб) приложение начальными данными, используя Spring / JPA / Hibernate - PullRequest
17 голосов
/ 11 марта 2010

Я хочу настроить мою базу данных с начальными данными программно. Я хочу заполнить свою базу данных для прогонов разработки, а не для тестов (это легко). Продукт построен на основе 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 генерирует новую схему. Поскольку БД тогда тоже пустая.

Ответы [ 11 ]

0 голосов
/ 12 марта 2010

Я не уверен, что вы можете избежать использования SQL. Это будет зависеть от того, работают ли ваши разработчики с пустой базой данных без определенной схемы или если таблицы есть, но они пусты.

Если вы начинаете с пустых таблиц, вы можете использовать подход Java для генерации данных. Я не очень знаком с Maven, но я предполагаю, что вы можете создать какую-то задачу, которая использовала бы ваши классы DAO для генерации данных. Вы могли бы даже написать его, используя язык сценариев на основе JVM, такой как Groovy, который мог бы напрямую использовать ваши классы DAO. У вас будет аналогичная задача, которая очистит данные из таблиц. Тогда ваши разработчики будут просто запускать эти задачи из командной строки или через IDE в качестве шага после извлечения вручную.

Если у вас есть свежий экземпляр базы данных, который, я думаю, вам потребуется выполнить SQL, чтобы создать схему. Технически это можно сделать, выполнив вызовы SQL с помощью hibernate, но, похоже, это того не стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...