Zastanawiam się, jak najlepiej załadować wstępne dane bazy danych przed uruchomieniem aplikacji? Szukam czegoś, co wypełni moją bazę danych H2 danymi.
Na przykład mam model domeny „Użytkownik”. Mam dostęp do użytkowników, przechodząc do / users, ale początkowo nie będzie żadnych użytkowników w bazie danych, więc muszę ich utworzyć. Czy istnieje możliwość automatycznego wypełnienia bazy danych danymi?
W tej chwili mam Bean, który jest uruchamiany przez kontener i tworzy dla mnie użytkowników.
Przykład:
@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"));
}
}
Ale bardzo wątpię, czy to najlepszy sposób na zrobienie tego. Albo to jest?
spring
spring-boot
spring-data
Lithicas
źródło
źródło
data.sql
i / lubschema.sql
zainicjuj dane. Wszystko to jest udokumentowane w przewodniku (który proponuję przeczytać).Odpowiedzi:
Możesz po prostu utworzyć plik data.sql w folderze src / main / resources i zostanie on automatycznie uruchomiony podczas uruchamiania. W tym pliku wystarczy dodać kilka instrukcji insert, np .:
Podobnie możesz utworzyć plik schema.sql (lub schema-h2.sql), aby utworzyć schemat:
Chociaż zwykle nie powinieneś tego robić, ponieważ rozruch sprężynowy już konfiguruje Hibernację, aby utworzyć schemat w oparciu o twoje encje dla bazy danych w pamięci. Jeśli naprawdę chcesz używać schema.sql, musisz wyłączyć tę funkcję, dodając to do pliku application.properties:
Więcej informacji można znaleźć w dokumentacji dotyczącej inicjalizacji bazy danych .
Jeśli używasz Spring boot 2 , inicjalizacja bazy danych działa tylko dla osadzonych baz danych (H2, HSQLDB, ...). Jeśli chcesz go używać również dla innych baz danych, musisz zmienić
spring.datasource.initialization-mode
właściwość:Jeśli korzystasz z wielu dostawców baz danych, możesz nazwać swój plik data-h2.sql lub data-mysql.sql zależności od platformy bazy danych, której chcesz używać.
Aby to zadziałało, musisz jednak skonfigurować
spring.datasource.platform
właściwość:źródło
schema.sql
/data.sql
zostaną wykonane, gdyspring.datasource.initialize
jesttrue
(co jest domyślne).spring.jpa.hibernate.ddl-auto
może służyć do generowania tabel na podstawie konfiguracji jednostki, a nie przy użyciu pliku SQL. Jest to domyślnie włączone w bazach danych w pamięci. Dlatego dodałem uwagę w mojej odpowiedzi, wyjaśniając, że jeśli używasz bazy danych w pamięci i chcesz użyćschema.sql
, musisz wyłączyć, wspring.jpa.hibernate.ddl-auto
przeciwnym razie oba spróbują utworzyć twoją tabelę.data-h2.sql
nazwy pliku dla swoich początkowych danych, powinieneś również ustawić jąspring.datasource.platform=h2
we właściwościach aplikacji.org.h2.jdbc.JdbcSQLException
wyjątek, ponieważ dane są już obecne w bazie danych. Używam wbudowanej bazy danych H2, ale problem pozostaje ten sam.MERGE INTO
. Odkryłem, że istnieje sposób na obejście tego za pomocą pliku import.sql zamiast data.sql . Wymaga onaspring.jpa.hibernate.ddl-auto
, aby utworzyć lub tworzyć upuść . Następnie za każdym razem, gdy tworzony jest plik schematu (i / lub wykonywany jest schema.sql ), wykonywany jest również plik import.sql . Mimo to: wydaje się, że jest obejściem, a nie czystą implementacją tworzenia danych init.Jeśli chcę wstawić proste dane testowe, często implementuję plik
ApplicationRunner
. Implementacje tego interfejsu są uruchamiane podczas uruchamiania aplikacji i mogą wykorzystywać np. Autowired repozytorium do wstawiania danych testowych.Myślę, że taka implementacja byłaby nieco bardziej wyraźna niż twoja, ponieważ interfejs sugeruje, że twoja implementacja zawiera coś, co chciałbyś zrobić bezpośrednio po przygotowaniu aplikacji.
Twoja implementacja wyglądałaby na coś. lubię to:
źródło
Jako sugestia spróbuj tego:
Opcja 2: Zainicjuj za pomocą schematu i skryptów danych
Wymagania wstępne: w
application.properties
musisz wspomnieć o tym:spring.jpa.hibernate.ddl-auto=none
(w przeciwnym razie skrypty zostaną zignorowane przez hibernacji i będzie to skanowanie za projekt@Entity
i / lub@Table
adnotacjami klas)Następnie w swojej
MyApplication
klasie wklej to:Gdzie
scripts
folder znajduje się wresources
folderze (IntelliJ Idea)Mam nadzieję, że to komuś pomoże
źródło
Możesz dodać
spring.datasource.data
właściwość doapplication.properties
listy plików sql, które chcesz uruchomić. Lubię to:Następnie zostaną uruchomione instrukcje sql insert w każdym z tych plików, co pozwoli ci zachować porządek.
Jeśli umieścisz pliki w ścieżce klas, na przykład
src/main/resources
zostaną one zastosowane. Lub wymienićclasspath:
zfile:
i bezwzględną ścieżkę do plikuźródło
file:
zamiastclasspath:
.Możesz użyć czegoś takiego:
źródło
Spring Boot umożliwia użycie prostego skryptu do zainicjowania bazy danych za pomocą Spring Batch .
Jeśli jednak chcesz użyć czegoś bardziej złożonego do zarządzania wersjami DB i tak dalej, Spring Boot dobrze integruje się z Flyway .
Zobacz też:
źródło
W Spring Boot 2 data.sql nie działała ze mną tak jak w Spring Boot 1.5
Ponadto plik o nazwie
import.sql
w katalogu głównym ścieżki klas jest wykonywany podczas uruchamiania, jeśli Hibernate tworzy schemat od podstaw (to znaczy, jeśli właściwość ddl-auto jest ustawiona na create lub create-drop).Uwaga bardzo ważne jeśli wstawisz Klucze nie mogą być powielone nie używaj właściwości ddl-auto jest ustawiona na aktualizację ponieważ przy każdym ponownym uruchomieniu wstawi te same dane
Więcej informacji można znaleźć na wiosennej stronie internetowej
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
źródło
Oto sposób, w jaki to zrozumiałem:
Podziękowania dla autora tego artykułu:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
źródło
Możesz po prostu utworzyć
import.sql
plik w programie,src/main/resources
a Hibernate wykona go po utworzeniu schematu.źródło
Podobny problem rozwiązałem w ten sposób:
źródło
Jeśli ktoś ma problemy, aby to zadziałało nawet po zaakceptowanej odpowiedzi , dla mnie pracuję tylko dodając w moim
src/test/resources/application.yml
H2datasource
szczegóły:źródło
możesz zarejestrować się i słuchać wydarzeń, aby to osiągnąć, jak poniżej:
Po uruchomieniu ContextRefreshEvent uzyskujemy dostęp do wszystkich autowired bean w aplikacji - w tym modeli i repozytoriów.
źródło
Jeśli chcesz wstawić tylko kilka wierszy i masz konfigurację JPA. Możesz użyć poniżej
źródło
To też zadziała.
źródło
Najbardziej kompaktowe (dla danych dynamicznych) rozwiązanie @ mathias-dpunkt w MainApp (z Lombok
@AllArgsConstructor
):źródło
Jesteś prawie na miejscu!
źródło
Możesz użyć poniższego kodu. W poniższym kodzie wstawienie bazy danych następuje podczas uruchamiania aplikacji rozruchu sprężynowego.
źródło