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?

Dari komunitas dokumentasi:

hibernate.hbm2ddl.auto secara Otomatis memvalidasi atau ekspor skema DDL ke database ketika SessionFactory dibuat. Dengan create-drop, skema database yang akan turun ketika SessionFactory ditutup secara eksplisit.

misalnya memvalidasi | update | membuat | membuat-drop

Jadi daftar opsi yang memungkinkan adalah,

  • validasi: memvalidasi skema, tidak membuat perubahan ke database.
  • update: update skema.
  • buat****: menciptakan skema, menghancurkan data-data sebelumnya.
  • create-drop: drop schema ketika SessionFactory ditutup secara eksplisit, biasanya ketika aplikasi dihentikan.

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?

Komentar (13)

Ada's juga tercatat nilai "none" untuk menonaktifkannya sepenuhnya.

Komentar (7)

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.

Komentar (3)

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.

Komentar (1)

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:

  • buat**** : - membuat skema, data yang sebelumnya hadir (jika ada) dalam skema hilang
  • update:- memperbarui skema dengan nilai yang diberikan.
  • validasi:- validasi skema. Itu membuat tidak ada perubahan dalam DB.
  • create-drop: membuat skema dengan menghancurkan data-data yang sebelumnya hadir(jika ada). Hal ini juga drop database schema ketika SessionFactory ditutup.

Berikut adalah poin-poin penting yang perlu dicatat:

  • Dalam kasus update, jika skema ini tidak hadir di DB maka skema ini dibuat.
  • Dalam kasus validasi, jika skema tidak ada di DB, itu tidak diciptakan. Sebaliknya, ia akan melempar kesalahan: - Meja tidak ditemukan:<nama table>
  • Dalam kasus create-drop, skema ini tidak turun pada penutupan sesi. Hanya tetes pada penutupan SessionFactory.
  • Dalam kasus jika saya memberikan nilai untuk properti ini(katakanlah abc, bukan empat di atas nilai-nilai yang dibahas di atas) atau hal ini hanya dibiarkan kosong. Hal itu menunjukkan perilaku berikut:

-Jika skema ini tidak hadir dalam DB:- menciptakan skema

-Jika skema ini hadir dalam DB:- update skema.

Komentar (3)

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 the SessionFactory, 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:

  1. Masa hibernasi.hbm2ddl.auto="update" nyaman tapi kurang fleksibel jika anda berencana untuk menambahkan fungsi atau mengeksekusi beberapa skrip kustom.
  2. Paling fleksibel pendekatan adalah dengan menggunakan Terbang.

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.

Komentar (0)

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.

  • buat - lakukan membuat skema
  • update - update yang sudah ada skema
  • validasi - validasi skema yang ada
  • create-drop - membuat dan drop schema secara otomatis ketika sesi dimulai dan berakhir
Komentar (1)

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:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are update,
 * create, create-drop and validate.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
Komentar (2)
  • 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.
Komentar (0)

Saya Pikir anda harus berkonsentrasi pada

SchemaExport Class 

Kelas ini Membuat Anda Konfigurasi Dinamis Sehingga hal ini memungkinkan anda untuk memilih apa pun yang suite anda yang terbaik...

Checkout [SchemaExport]

Komentar (0)

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.

Komentar (0)

Sejak 5.0, sekarang anda dapat menemukan nilai-nilai dalam dedicated Enum: org.hibernate.boot.SchemaAutoTooling (ditingkatkan dengan value NONE 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 dengan org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO tapi saat ini kode mengharapkan String nilai (kutipan diambil dari SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

... dan internal enum nilai-nilai dari kedua org.hibernate.boot.SchemaAutoToolingdan org.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 (tidak create-drop misalnya):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map properties = new HashMap();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}
Komentar (0)

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.

Komentar (0)