Как загрузить исходные данные (или начальные данные) с помощью Java JPA? - PullRequest
7 голосов
/ 22 марта 2012

У меня есть проект JPA, и я хотел бы вставить некоторые исходные данные только в процессе разработки, чтобы я мог проверить, все ли идет гладко и просто.

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

В мире ruby ​​on rails у нас есть команда "rake db: seed", которая просто выполняет файл с именем seed.rb, в котором есть функция добавления начальных данных в базу данных, вызывающая уровень абстракции.Есть ли что-то подобное в Java?

Идеальное решение, о котором я могу подумать, - это выполнить задачу maven, которая бы выполняла класс java, есть ли простой способ или плагин maven для этого?

Ответы [ 5 ]

4 голосов
/ 23 марта 2012

Я чувствую твою боль, мне не хватает проекта Java для всех привилегий, которые есть в Rails.

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

Что вам нужно сделать, это использовать ваши модели JPA для заполнения ваших данных. Создайте компонент, который может выполнять создание необходимых вам моделей, и сохраните их. В моем текущем проекте мы используем Snake YAML для сериализации наших моделей как Yaml. Чтобы заполнить нашу базу данных, мы десериализовали модели yaml в JPA и сохранили.

Если модели изменяются (изменяются типы переменных, удаляются столбцы и т. Д.), Необходимо убедиться, что данные сериализации по-прежнему смогут правильно десериализоваться в модели JPA. Использование удобочитаемого формата Yaml позволяет легко обновлять сериализованные модели.

Чтобы на самом деле запустить ваши начальные данные, загрузите вашу систему так, как можете. Как сказал @GeoorgeMcDowd, вы можете использовать сервлет. Я лично предпочитаю создавать инструмент командной строки, создавая Uberjar с Class.main. Затем вам просто нужно создать скрипт для настройки вашего classpath и вызвать Class.main для запуска затравки.

Лично я люблю Maven как метаданные проекта, но считаю его сложным инструментом сборки. Следующее может быть использовано для исполнения Java-класса:

mvn exec:java -Dexec.mainClass="com.package.Main"
2 голосов
/ 22 марта 2012

Просто создайте класс и метод, который создает объекты и сохраняет данные. Когда вы запустите приложение, запустите метод, созданный в init сервлета. Вы можете загрузить свой сервлет с помощью следующей конфигурации web.xml.

<servlet>
   <servlet-name>MyServlet1</servlet-name>
   <servlet-class>com.example.MyServlet1</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>

Редактировать: отформатируйте web.xml, чтобы сделать его более удобным для чтения.

1 голос
/ 23 марта 2012

Вы можете смоделировать свой проект с помощью Maven и написать простой тест для инициализации начальных данных, поэтому единственное, что вам нужно будет сделать, это запустить "mvn test".

0 голосов
/ 03 января 2016

Я бы предложил для этого жидкостьбазу http://www.liquibase.org/.Он имеет множество плагинов и позволяет вам определять логику отката для каждого набора изменений (и обнаруживать откат в некоторых случаях).

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

0 голосов
/ 23 марта 2012

Аналогично идее Амуниса: взгляните на dbunit . Это расширение JUnit для оцифровки тестовых данных в БД. Для этого используется простой XML-формат без схемы. И запустить его через тестовый класс с помощью «mvn test» очень просто.

...