Saya bertanya-tanya apa cara terbaik untuk memuat data basis data awal sebelum aplikasi dimulai? Apa yang saya cari adalah sesuatu yang akan mengisi database H2 saya dengan data.
Sebagai contoh, saya memiliki model domain "Pengguna" Saya dapat mengakses pengguna dengan mengunjungi / pengguna tetapi pada awalnya tidak akan ada pengguna dalam database sehingga saya harus membuatnya. Apakah ada yang mengisi database dengan data secara otomatis?
Saat ini saya memiliki Bean yang akan dipakai oleh wadah dan membuat pengguna untuk saya.
Contoh:
@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"));
}
}
Tetapi saya sangat meragukan itu adalah cara terbaik untuk melakukannya. Atau itu?
spring
spring-boot
spring-data
Lithica
sumber
sumber
data.sql
dan / atauschema.sql
untuk init data .. Semua ini didokumentasikan dalam panduan referensi (yang saya sarankan untuk dibaca).Jawaban:
Anda cukup membuat file data.sql di folder src / main / resources Anda dan secara otomatis akan dieksekusi saat startup. Dalam file ini Anda cukup menambahkan beberapa pernyataan insert, mis .: .:
Demikian pula, Anda dapat membuat file schema.sql (atau schema-h2.sql) juga untuk membuat skema Anda:
Meskipun biasanya Anda tidak harus melakukan ini karena boot Spring sudah mengkonfigurasi Hibernate untuk membuat skema Anda berdasarkan entitas Anda untuk dalam database memori. Jika Anda benar-benar ingin menggunakan schema.sql Anda harus menonaktifkan fitur ini dengan menambahkan ini ke application.properties Anda:
Informasi lebih lanjut dapat ditemukan di dokumentasi tentang inisialisasi Database .
Jika Anda menggunakan Spring boot 2 , inisialisasi database hanya berfungsi untuk basis data tertanam (H2, HSQLDB, ...). Jika Anda ingin menggunakannya untuk database lain juga, Anda perlu mengubah
spring.datasource.initialization-mode
properti:Jika Anda menggunakan beberapa vendor basis data, Anda dapat memberi nama file data-h2.sql atau data-mysql.sql Anda tergantung pada platform basis data mana yang ingin Anda gunakan.
Untuk membuatnya bekerja, Anda harus mengkonfigurasi
spring.datasource.platform
properti:sumber
schema.sql
/data.sql
file akan dieksekusi ketikaspring.datasource.initialize
adalahtrue
(yang merupakan default).spring.jpa.hibernate.ddl-auto
dapat digunakan untuk menghasilkan tabel Anda berdasarkan konfigurasi entitas Anda daripada menggunakan file SQL. Ini secara default diaktifkan pada database dalam memori. Itu sebabnya saya menambahkan catatan dalam jawaban saya, menjelaskan bahwa jika Anda menggunakan basis data dalam memori dan Anda ingin menggunakanschema.sql
, Anda harus menonaktifkanspring.jpa.hibernate.ddl-auto
jika tidak keduanya akan mencoba membuat tabel Anda.data-h2.sql
nama file untuk data awal Anda, Anda harus mengaturspring.datasource.platform=h2
properti aplikasi Anda juga.org.h2.jdbc.JdbcSQLException
-exepsi, karena data sudah ada dalam database. Saya menggunakan database H2 tertanam, tetapi masalahnya tetap sama.MERGE INTO
. Saya menemukan, bahwa ada cara untuk menghindari ini menggunakan file import.sql, bukan data.sql . Perluspring.jpa.hibernate.ddl-auto
untuk membuat atau membuat-drop . Kemudian setiap kali file skema dibuat (dan / atau skema.sql dijalankan), import.sql juga dieksekusi. Tetap: ini terasa seperti solusi dan bukan implementasi yang bersih untuk menciptakan data init.Jika saya hanya ingin memasukkan data pengujian sederhana, saya sering menerapkan
ApplicationRunner
. Implementasi antarmuka ini dijalankan pada saat startup aplikasi dan dapat menggunakan misal repositori yang diotorisasi untuk menyisipkan beberapa data uji.Saya pikir implementasi semacam itu akan sedikit lebih eksplisit daripada milik Anda karena antarmuka menyiratkan bahwa implementasi Anda berisi sesuatu yang ingin Anda lakukan langsung setelah aplikasi Anda siap.
Implementasi Anda akan terlihat sth. seperti ini:
sumber
Sebagai saran coba ini:
Opsi 2: Inisialisasi dengan skema dan skrip data
Prasyarat:
application.properties
Anda harus menyebutkan ini:spring.jpa.hibernate.ddl-auto=none
(Jika tidak, skrip akan diabaikan oleh hibernate, dan itu akan memindai proyek untuk@Entity
dan / atau@Table
kelas yang dianotasi)Kemudian, di
MyApplication
kelas Anda tempel ini:Di mana
scripts
folder berada di bawahresources
folder (IntelliJ Idea)Semoga ini bisa membantu seseorang
sumber
Anda dapat menambahkan
spring.datasource.data
properti keapplication.properties
daftar file sql yang ingin Anda jalankan. Seperti ini:Pernyataan memasukkan sql di masing-masing file ini kemudian akan dijalankan, memungkinkan Anda untuk menjaga hal-hal tetap rapi.
Jika Anda meletakkan file di classpath, misalnya di
src/main/resources
mereka akan diterapkan. Atau ganticlasspath:
denganfile:
dan gunakan jalur absolut ke filesumber
file:
bukanclasspath:
.Anda dapat menggunakan sesuatu seperti ini:
sumber
Spring Boot memungkinkan Anda untuk menggunakan skrip sederhana untuk menginisialisasi database Anda, menggunakan Spring Batch .
Namun, jika Anda ingin menggunakan sesuatu yang sedikit lebih rumit untuk mengelola versi DB dan seterusnya, Spring Boot terintegrasi dengan baik dengan Flyway .
Lihat juga:
sumber
Di Spring Boot 2 data.sql tidak bekerja dengan saya seperti pada spring boot 1.5
Selain itu, file bernama
import.sql
di root classpath dieksekusi pada startup jika Hibernate membuat skema dari awal (yaitu, jika properti ddl-auto diatur untuk membuat atau membuat-drop).Catatan sangat penting jika Anda memasukkan Kunci tidak dapat diduplikasi jangan gunakan properti ddl-auto diatur untuk memperbarui karena dengan setiap restart akan memasukkan data yang sama lagi
Untuk informasi lebih lanjut Anda mengunjungi websit musim semi
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
sumber
Inilah cara saya mendapatkannya:
Terima kasih kepada penulis artikel ini:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
sumber
Anda cukup membuat
import.sql
file disrc/main/resources
dan Hibernate akan menjalankannya ketika skema dibuat.sumber
Saya memecahkan masalah serupa dengan cara ini:
sumber
Jika seseorang berjuang untuk membuatnya bekerja bahkan mengikuti jawaban yang diterima , bagi saya hanya bekerja dengan menambahkan rincian
src/test/resources/application.yml
H2 sayadatasource
:sumber
Anda dapat mendaftar dan pendengar acara untuk mencapai itu seperti di bawah ini:
Ketika ContextRefreshEvent dipecat, kami mendapatkan akses ke semua kacang autowired dalam aplikasi - termasuk model dan repositori.
sumber
Jika Anda ingin memasukkan hanya beberapa baris dan Anda memiliki Pengaturan JPA. Anda bisa menggunakan di bawah ini
sumber
Ini juga akan berfungsi.
sumber
Solusi yang paling ringkas (untuk data dinamis) memasukkan @ mathias-dpunkt ke MainApp (dengan Lombok
@AllArgsConstructor
):sumber
Kamu hampir sampai!
sumber
Anda dapat menggunakan kode di bawah ini. Dalam kode berikut penyisipan basis data terjadi selama permulaan aplikasi boot musim semi.
sumber