Saya benar-benar ingin tahu lebih banyak tentang pembaruan, ekspor, dan nilai-nilai yang dapat diberikan hibernate.hbm2ddl.auto
saya, saya perlu tahu kapan harus menggunakan pembaruan dan kapan tidak? Dan apa alternatifnya?
Ini adalah perubahan yang bisa terjadi pada DB:
- tabel baru
- kolom baru di tabel lama
- kolom dihapus
- tipe data kolom berubah
- tipe kolom mengubah atributnya
- tabel terjatuh
- nilai kolom berubah
Dalam setiap kasus, apa solusi terbaik?
Ada juga nilai tidak berdokumen "tidak ada" untuk menonaktifkannya sepenuhnya.
sumber
Properti konfigurasi disebut
hibernate.hbm2ddl.auto
Dalam lingkungan pengembangan kami, kami menetapkan
hibernate.hbm2ddl.auto=create-drop
untuk menjatuhkan dan membuat basis data yang bersih setiap kali kami menggunakan, sehingga basis data kami berada dalam kondisi yang diketahui.Secara teori, Anda dapat mengatur
hibernate.hbm2ddl.auto=update
untuk memperbarui basis data Anda dengan perubahan pada model Anda, tetapi saya tidak akan mempercayainya pada basis data produksi. Versi dokumentasi yang lebih lama mengatakan bahwa ini adalah percobaan, setidaknya; Saya tidak tahu status saat ini.Karena itu, untuk basis data produksi kami, jangan setel
hibernate.hbm2ddl.auto
- defaultnya adalah tidak membuat perubahan basis data. Sebagai gantinya, kami secara manual membuat skrip pembaruan SQL DDL yang menerapkan perubahan dari satu versi ke yang berikutnya.sumber
Saya akan menggunakan liquibase untuk memperbarui db Anda. fitur pembaruan skema hibernate benar-benar hanya baik untuk pengembang ketika mereka sedang mengembangkan fitur baru. Dalam situasi produksi, peningkatan db perlu ditangani dengan lebih hati-hati.
sumber
Meskipun itu posting yang cukup lama tetapi ketika saya melakukan riset tentang topik itu jadi berpikir untuk membagikannya.
hibernate.hbm2ddl.auto
Sesuai dokumentasi itu dapat memiliki empat nilai yang valid:
buat | perbarui | validasi | buat-jatuhkan
Berikut ini adalah penjelasan perilaku yang ditunjukkan oleh nilai ini:
Berikut ini adalah poin penting yang perlu diperhatikan:
Table not found:<table name>
Dalam kasus jika saya memberikan nilai apa pun untuk properti ini (katakanlah abc, alih-alih empat nilai yang dibahas di atas) atau dibiarkan kosong. Ini menunjukkan perilaku berikut:
-Jika skema tidak ada dalam DB: - Ini menciptakan skema
-Jika ada skema dalam DB: - perbarui skema.
sumber
Pertama, nilai yang mungkin untuk
hbm2ddl
properti konfigurasi adalah yang berikut:none
- Tidak ada tindakan yang dilakukan. Skema tidak akan dihasilkan.create-only
- Skema basis data akan dibuat.drop
- Skema basis data akan dihapus dan dibuat setelahnya.create
- Skema basis data akan dihapus dan dibuat setelahnya.create-drop
- Skema basis data akan dihapus dan dibuat setelahnya. Setelah menutupSessionFactory
, skema basis data akan dihapus.validate
- Skema basis data akan divalidasi menggunakan pemetaan entitas.update
- Skema basis data akan diperbarui dengan membandingkan skema basis data yang ada dengan pemetaan entitas.Saya mendedikasikan posting blog untuk strategi generasi Hibernate DDL yang paling umum :
hibernate.hbm2ddl.auto="update"
nyaman tetapi kurang fleksibel jika Anda berencana untuk menambahkan fungsi atau menjalankan beberapa skrip khusus.Namun, bahkan jika Anda menggunakan Flyway, Anda masih dapat membuat skrip migrasi awal menggunakan hbm2ddl. Di artikel ini , Anda bisa melihat bagaimana Anda bisa menggabungkan Model Entitas JPA dengan Model Tabel jOOQ.
sumber
hibernate.hbm2ddl.auto
secara otomatis memvalidasi dan mengekspor DDL ke skema ketika sessionFactory dibuat.Secara default, ia tidak melakukan kreasi atau modifikasi apa pun secara otomatis pada DB. Jika pengguna menetapkan salah satu dari nilai di bawah ini maka ia melakukan perubahan skema DDL secara otomatis.
buat - buat membuat skema
perbarui - memperbarui skema yang ada
memvalidasi - memvalidasi skema yang ada
create-drop - buat dan jatuhkan skema secara otomatis saat sesi dimulai dan berakhir
sumber
Jika Anda tidak ingin menggunakan Strings di aplikasi Anda dan mencari konstanta yang telah ditentukan, lihatlah
org.hibernate.cfg.AvailableSettings
kelas yang termasuk dalam Hibernate JAR, di mana Anda akan menemukan konstanta untuk semua pengaturan yang mungkin. Dalam kasus Anda misalnya:sumber
validate
: memvalidasi skema, tidak ada perubahan yang terjadi pada database.update
: memperbarui skema dengan permintaan eksekusi saat ini.create
: membuat skema baru setiap saat, dan menghancurkan data sebelumnya.create-drop
: menjatuhkan skema ketika aplikasi dihentikan atau SessionFactory ditutup secara eksplisit.sumber
Saya pikir Anda harus berkonsentrasi pada
Kelas ini Membuat Konfigurasi Anda Dinamis Sehingga memungkinkan Anda untuk memilih suite apa pun yang Anda ...
Checkout [SchemaExport]
sumber
validate
: Ini memvalidasi skema dan tidak membuat perubahan pada DB.Asumsikan Anda telah menambahkan kolom baru dalam file pemetaan dan melakukan operasi penyisipan, itu akan memunculkan Pengecualian "melewatkan kolom XYZ" karena skema yang ada berbeda dari objek yang akan Anda masukkan. Jika Anda mengubah tabel dengan menambahkan kolom baru secara manual kemudian melakukan operasi Sisipkan maka pasti akan memasukkan semua kolom bersama dengan kolom baru ke Tabel. Berarti itu tidak membuat perubahan / mengubah skema / tabel yang ada.
update
: itu mengubah tabel yang ada di database ketika Anda melakukan operasi. Anda dapat menambah atau menghapus kolom dengan opsi hbm2ddl ini. Tetapi jika Anda akan menambahkan kolom baru yang 'TIDAK NULL' maka itu akan mengabaikan menambahkan kolom tertentu ke DB. Karena Tabel harus kosong jika Anda ingin menambahkan kolom 'TIDAK NULL' ke tabel yang ada.sumber
Sejak 5.0 , Anda sekarang dapat menemukan nilai-nilai itu di khusus
Enum
:org.hibernate.boot.SchemaAutoTooling
(ditingkatkan dengan nilaiNONE
sejak 5.2).Atau bahkan lebih baik, karena 5.1 , Anda juga dapat menggunakan
org.hibernate.tool.schema.Action
Enum
yang menggabungkan aksi-aksi Hibernate JPA 2 dan "legacy" DDL.Namun , Anda belum dapat mengkonfigurasi
DataSource
program dengan ini. Akan lebih baik untuk menggunakan ini dikombinasikan denganorg.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
tetapi kode saat ini mengharapkanString
nilai (kutipan diambil dariSessionFactoryBuilderImpl
):... dan
enum
nilai internal keduanyaorg.hibernate.boot.SchemaAutoTooling
danorg.hibernate.tool.schema.Action
tidak diekspos secara publik.Di bawah ini, contoh
DataSource
konfigurasi program (digunakan pada salah satu aplikasi Boot Musim Semi saya) yang menggunakan terima kasih gambit.name().toLowerCase()
tetapi hanya berfungsi dengan nilai tanpa tanda hubung (tidakcreate-drop
misalnya):sumber
Kepada siapa mencari nilai default ...
Itu ditulis dalam kode sumber di versi 2.0.5 dari boot-spring dan 1.1.0 di JpaProperties:
sumber