Pengguna anonim
Lebih
Apa nilai-nilai yang mungkin dari Hibernate hbm2ddl.auto konfigurasi dan apa yang mereka lakukan
Aku benar-benar ingin tahu lebih lanjut tentang pembaruan ini, ekspor dan nilai-nilai yang dapat diberikan untuk hibernate.hbm2ddl.auto
Aku perlu tahu kapan untuk menggunakan update dan bila tidak? Dan apa alternatifnya?
Ini adalah perubahan yang bisa terjadi lebih dari DB:
- tabel baru
- kolom baru di tabel tua
- kolom dihapus
- tipe data dari kolom berubah
- jenis kolom diubah atributnya
- tabel turun
- nilai-nilai dari kolom yang berubah
Dalam setiap kasus apa solusi terbaik?
1037
13
Dari komunitas dokumentasi:
Jadi daftar opsi yang memungkinkan adalah,
Pilihan ini tampaknya dimaksudkan untuk menjadi pengembang yang sesuai dan tidak untuk memfasilitasi setiap tingkat produksi database, anda mungkin ingin melihat pada pertanyaan berikut; Hibernate: hbm2ddl.auto=update di produksi?
Ada's juga tercatat nilai "none" untuk menonaktifkannya sepenuhnya.
Konfigurasi properti disebut
hibernate.hbm2ddl.auto
Dalam pengembangan lingkungan kita set
hibernate.hbm2ddl.auto=create-drop
untuk menjatuhkan dan membuat database bersih setiap kali kita menyebarkan, sehingga database kami berada di sebuah negara yang dikenal.Secara teori, anda dapat mengatur
hibernate.hbm2ddl.auto=update
untuk memperbarui database anda dengan perubahan pada model anda, tapi aku tidak akan percaya bahwa pada database produksi. Versi sebelumnya dari dokumentasi mengatakan bahwa ini adalah eksperimental, setidaknya, saya tidak tahu status.Oleh karena itu, untuk produksi kami database, tidak menetapkan
hibernate.hbm2ddl.auto
- default adalah untuk tidak membuat perubahan database. Sebaliknya, kita secara manual membuat SQL DDL script update yang berlaku perubahan dari satu versi ke versi berikutnya.Saya akan menggunakan liquibase untuk memperbarui db. hibernate's skema update fitur ini benar-benar hanya o.k. untuk pengembang saat mereka sedang mengembangkan fitur-fitur baru. Dalam situasi produksi, db upgrade perlu ditangani lebih hati-hati.
Meskipun cukup lama posting tapi seperti yang saya lakukan beberapa penelitian pada topik jadi berpikir untuk berbagi.
hibernate.hbm2ddl.auto
Sesuai dokumentasi dapat memiliki empat nilai yang valid:
buat | update | validate | membuat-drop
Berikut adalah penjelasan dari perilaku yang ditunjukkan oleh nilai berikut ini:
Berikut adalah poin-poin penting yang perlu dicatat:
tidak ditemukan:<nama table>
-Jika skema ini tidak hadir dalam DB:- menciptakan skema
-Jika skema ini hadir dalam DB:- update skema.
Pertama, nilai yang mungkin untuk
hbm2ddl
konfigurasi properti adalah yang berikut:ada
- Tidak ada tindakan yang dilakukan. Skema tidak akan dihasilkan.membuat-satunya
- skema database Yang akan dihasilkan.drop
- skema database Yang akan turun dan dibuat setelah itu.create
- skema database Yang akan turun dan dibuat setelah itu.create-drop
- skema database Yang akan turun dan dibuat setelah itu. Pada penutupan theSessionFactory
, skema database yang akan turun.validasi
- skema database Yang akan divalidasi menggunakan badan pemetaan.update
- skema database akan diperbarui dengan membandingkan ada skema database dengan badan pemetaan.Saya mendedikasikan blog post yang paling umum Hibernate DDL generasi strategi:
hibernasi.hbm2ddl.auto="update"
nyaman tapi kurang fleksibel jika anda berencana untuk menambahkan fungsi atau mengeksekusi beberapa skrip kustom.Namun, bahkan jika anda menggunakan Flyway, anda masih dapat menghasilkan migrasi awal script menggunakan hbm2ddl. Di artikel ini, anda dapat melihat bagaimana anda dapat menggabungkan LPJ Badan Model dengan jOOQ Meja Model.
hibernate.hbm2ddl.auto
otomatis memvalidasi dan ekspor DDL untuk skema ketika sessionFactory dibuat.Secara default, itu tidak melakukan pembuatan atau modifikasi secara otomatis pada DB. Jika pengguna menetapkan salah satu di bawah ini nilai-nilai itu melakukan DDL skema perubahan secara otomatis.
Jika anda don't ingin menggunakan String di aplikasi anda dan mencari konstanta yang telah ditetapkan telah melihat
org.hibernate.cfg.AvailableSettings
kelas termasuk dalam Hibernate JAR, di mana anda'll menemukan konstan untuk semua pengaturan yang mungkin. Dalam kasus anda misalnya:validasi
: memvalidasi skema, tidak ada perubahan yang terjadi pada database.update
: update skema dengan saat ini mengeksekusi query.create
: menciptakan skema baru setiap waktu, dan menghancurkan data-data sebelumnya.create-drop
: tetes skema ketika aplikasi berhenti atau SessionFactory ditutup secara eksplisit.Saya Pikir anda harus berkonsentrasi pada
Kelas ini Membuat Anda Konfigurasi Dinamis Sehingga hal ini memungkinkan anda untuk memilih apa pun yang suite anda yang terbaik...
Checkout [SchemaExport]
validasi
: memvalidasi skema dan tidak membuat perubahan pada DB. Asumsikan anda telah menambahkan sebuah kolom baru di file pemetaan dan melakukan operasi insert, ia akan melempar Pengecualian "hilang XYZ kolom" karena sudah ada skema yang berbeda dari objek yang akan anda masukkan. Jika anda mengubah tabel dengan menambahkan kolom baru secara manual kemudian melakukan operasi Insert maka pasti akan memasukkan semua kolom selain kolom baru ke Tabel. Berarti itu doesn't membuat perubahan/mengubah skema yang ada/meja.update
: ia mengubah tabel yang ada di database saat anda melakukan operasi. Anda dapat menambahkan atau menghapus kolom ini dengan pilihan hbm2ddl. Tetapi jika anda akan untuk menambahkan kolom baru yang 'NOT NULL' maka ia akan mengabaikan menambahkan bahwa kolom tertentu ke DB. Karena Tabel harus kosong jika anda ingin menambahkan 'NOT NULL' kolom untuk tabel yang ada.Sejak 5.0, sekarang anda dapat menemukan nilai-nilai dalam dedicated
Enum
:org.hibernate.boot.SchemaAutoTooling
(ditingkatkan dengan valueNONE
karena 5.2).Atau bahkan lebih baik, sejak 5.1, anda juga dapat menggunakan
org.hibernate.alat.skema.Aksi
Enum
yang menggabungkan JPA 2 dan "warisan" Hibernate DDL tindakan.Tapi, anda belum bisa mengkonfigurasi
sumber data
pemrograman dengan ini. Itu akan lebih baik untuk menggunakan ini dikombinasikan denganorg.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
tapi saat ini kode mengharapkanString
nilai (kutipan diambil dariSessionFactoryBuilderImpl
):... dan internal
enum
nilai-nilai dari keduaorg.hibernate.boot.SchemaAutoTooling
danorg.hibernate.alat.skema.Aksi
aren't terekspos publik.Di bawah ini, contoh program
sumber data
konfigurasi (digunakan pada orang-orang yang saya musim Semi Boot aplikasi) yang menggunakan gambit terima kasih kepada.nama().toLowerCase()
tetapi hanya bekerja dengan nilai-nilai tanpa dash (tidakcreate-drop
misalnya):Secara teori, anda dapat mengatur hibernate.hbm2ddl.auto=update untuk memperbarui database anda dengan perubahan pada model anda, tapi aku tidak akan percaya bahwa pada database produksi. Versi sebelumnya dari dokumentasi mengatakan bahwa ini adalah eksperimental, setidaknya, saya tidak tahu status.
Oleh karena itu, untuk produksi kami database, tidak mengatur hibernate.hbm2ddl.auto - default adalah untuk tidak membuat perubahan database. Sebaliknya, kita secara manual membuat SQL DDL script update yang berlaku perubahan dari satu versi ke versi berikutnya.