Мне интересно, как лучше загрузить исходные данные базы данных перед запуском приложения? То, что я ищу, это то, что заполнит мою базу данных H2 данными.
Например, у меня есть модель домена «Пользователь». Я могу получить доступ к пользователям, перейдя в / users, но изначально в базе данных пользователей не будет, поэтому мне нужно их создать. Есть ли способ автоматически заполнять базу данных данными?
На данный момент у меня есть Бин, который создается экземпляром контейнера и создает пользователей для меня.
Пример:
@Component
public class DataLoader {
private UserRepository userRepository;
@Autowired
public DataLoader(UserRepository userRepository) {
this.userRepository = userRepository;
LoadUsers();
}
private void LoadUsers() {
userRepository.save(new User("lala", "lala", "lala"));
}
}
Но я очень сомневаюсь, что это лучший способ сделать это. Либо это?
spring
spring-boot
spring-data
Lithicas
источник
источник
data.sql
и / илиschema.sql
инициализирует данные. Все это задокументировано в справочном руководстве (которое я предлагаю прочитать).Ответы:
Вы можете просто создать файл data.sql в папке src / main / resources, и он будет автоматически выполнен при запуске. В этом файле вы просто добавляете несколько операторов вставки, например:
Точно так же вы можете создать файл schema.sql (или schema-h2.sql), чтобы создать свою схему:
Хотя обычно вам не нужно этого делать, поскольку Spring boot уже настраивает Hibernate для создания вашей схемы на основе ваших сущностей для базы данных в памяти. Если вы действительно хотите использовать schema.sql, вам придется отключить эту функцию, добавив ее в ваш application.properties:
Более подробную информацию можно найти в документации по инициализации базы данных .
Если вы используете Spring boot 2 , инициализация базы данных работает только для встроенных баз данных (H2, HSQLDB, ...). Если вы хотите использовать его и для других баз данных, вам нужно изменить
spring.datasource.initialization-mode
свойство:Если вы используете несколько поставщиков баз данных, вы можете назвать свой файл data-h2.sql или data-mysql.sql в зависимости от того, какую платформу базы данных вы хотите использовать.
Чтобы это работало, вам нужно настроить
spring.datasource.platform
свойство:источник
schema.sql
/data.sql
будут выполняться, когдаspring.datasource.initialize
естьtrue
(это значение по умолчанию).spring.jpa.hibernate.ddl-auto
может использоваться для генерации ваших таблиц на основе конфигурации вашей сущности, а не с помощью файла SQL. Это по умолчанию включено в базах данных в памяти. Вот почему я добавил примечание в своем ответе, объясняющее, что если вы используете базу данных в памяти и хотите использовать ееschema.sql
, вам нужно отключить,spring.jpa.hibernate.ddl-auto
иначе оба будут пытаться создать вашу таблицу.data-h2.sql
имя файла для ваших начальных данных, вы должны также установить егоspring.datasource.platform=h2
в свойствах приложения.org.h2.jdbc.JdbcSQLException
исключение, потому что данные уже присутствуют в базе данных. Я использую встроенную базу данных H2, но проблема остается той же.MERGE INTO
. Я понял, что есть способ обойти это, используя файл import.sql вместо data.sql . Она требует ,spring.jpa.hibernate.ddl-auto
чтобы создать или создать падение . Затем каждый раз, когда создается файл схемы (и / или выполняется схема.sql ), import.sql . Тем не менее: это похоже на обходной путь, а не чистую реализацию создания данных инициализации.Если я просто хочу вставить простые тестовые данные, я часто реализую
ApplicationRunner
. Реализации этого интерфейса запускаются при запуске приложения и могут использовать, например, автоматическое хранилище для вставки некоторых тестовых данных.Я думаю, что такая реализация будет немного более явной, чем ваша, потому что интерфейс подразумевает, что ваша реализация содержит то, что вы хотели бы сделать непосредственно после того, как ваше приложение будет готово.
Ваша реализация будет выглядеть как как это:
источник
Вы можете добавить
spring.datasource.data
свойство вapplication.properties
список файлов sql, которые вы хотите запустить. Как это:Затем будут выполняться операторы вставки sql в каждом из этих файлов, что позволит вам поддерживать порядок.
Если вы поместите файлы в classpath, например,
src/main/resources
они будут применены. Или заменитьclasspath:
наfile:
и использовать абсолютный путь к файлуисточник
file:
вместоclasspath:
.В качестве предложения попробуйте это:
Вариант 2: Инициализация со схемой и сценариями данных
Пререквизиты: в
application.properties
вас есть упоминание об этом:spring.jpa.hibernate.ddl-auto=none
(в противном случае сценарии будут игнорироваться hibernate, и он будет сканировать проект@Entity
и / или@Table
аннотированные классы)Затем в вашем
MyApplication
классе вставьте это:Где
scripts
находится папкаresources
папке (IntelliJ Idea)Надеюсь, это поможет кому-то
источник
Вы можете использовать что-то вроде этого:
источник
Spring Boot позволяет использовать простой скрипт для инициализации вашей базы данных, используя Spring Batch .
Тем не менее, если вы хотите использовать что-то более сложное для управления версиями БД и т. Д., Spring Boot хорошо интегрируется с Flyway .
Смотрите также:
источник
В Spring Boot 2 data.sql не работал со мной, как в весенней загрузке 1.5
Кроме того, файл с именем
import.sql
в корне пути к классам, выполняется при запуске, если Hibernate создает схему с нуля (то есть, если для свойства ddl-auto установлено значение create или create-drop).Обратите внимание, очень важно, если вы вставляете ключи не могут быть продублированы, не используйте ddl-auto, свойство устанавливается на обновление, потому что при каждом перезапуске будут вставляться одни и те же данные снова
Для получения дополнительной информации вы посетите весенний веб-сайт
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
источник
Вот как я это понял:
Спасибо автору этой статьи:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
источник
Вы можете просто создать
import.sql
файл,src/main/resources
и Hibernate выполнит его при создании схемы.источник
Я решил подобную проблему следующим образом:
источник
Если кто-то изо всех сил пытается заставить это работать даже после принятого ответа , для меня только работа, добавляющая в мои детали
src/test/resources/application.yml
H2datasource
:источник
Вы можете зарегистрироваться и прослушивать события, чтобы добиться этого, как показано ниже:
Когда запускается ContextRefreshEvent, мы получаем доступ ко всем автоматически подключаемым bean-компонентам в приложении, включая модели и репозитории.
источник
Если вы хотите вставить только несколько строк и у вас есть JPA Setup. Вы можете использовать ниже
источник
Это тоже будет работать.
источник
Самое компактное (для динамических данных) размещение решения @ mathias-dpunkt в MainApp (с Lombok
@AllArgsConstructor
):источник
Ты почти там!
источник
Вы можете использовать приведенный ниже код. В следующем коде вставка базы данных происходит во время запуска приложения весенней загрузки.
источник