Pertanyaan Hibernate hbm2ddl.auto nilai yang mungkin dan apa yang mereka lakukan?


Saya benar-benar ingin tahu lebih banyak tentang pembaruan, ekspor, dan nilai-nilai yang dapat diberikan kepada hibernate.hbm2ddl.auto
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 dari kolom diubah
  • jenis kolom mengubah atributnya
  • tabel dijatuhkan
  • nilai-nilai kolom diubah

Dalam setiap kasus, apakah solusi terbaik?


900
2018-01-13 06:40


asal


Jawaban:


Dari dokumentasi komunitas:

hibernate.hbm2ddl.auto Secara otomatis memvalidasi atau mengekspor skema DDL ke database ketika SessionFactory dibuat. Dengan membuat-drop, skema database akan dijatuhkan ketika SessionFactory ditutup secara eksplisit.

misalnya memvalidasi | pembaruan | buat | buat-jatuhkan

Jadi daftar opsi yang memungkinkan adalah,

  • mengesahkan: memvalidasi skema, tidak membuat perubahan ke database.
  • memperbarui: perbarui skema.
  • membuat: membuat skema, menghancurkan data sebelumnya.
  • buat-jatuhkan: jatuhkan skema ketika SessionFactory ditutup secara eksplisit, biasanya ketika aplikasi dihentikan.

Opsi ini tampaknya dimaksudkan sebagai alat pengembang dan tidak memfasilitasi basis data tingkat produksi apa pun, Anda mungkin ingin melihat pertanyaan berikut; Hibernate: hbm2ddl.auto = pembaruan dalam produksi?


919
2017-11-06 19:25



Ada juga nilai tanpa dokumen "tidak ada" untuk menonaktifkannya sepenuhnya.


161
2018-06-08 14:52



Properti konfigurasi disebut hibernate.hbm2ddl.auto

Dalam lingkungan pengembangan kami, kami menetapkan hibernate.hbm2ddl.auto=create-drop untuk menjatuhkan dan membuat database bersih setiap kali kami menyebarkan, sehingga database kami berada dalam keadaan yang diketahui.

Secara teori, Anda dapat mengatur hibernate.hbm2ddl.auto=update untuk memperbarui database Anda dengan perubahan pada model Anda, tetapi saya tidak akan mempercayai itu pada basis data produksi. Versi sebelumnya dari dokumentasi mengatakan bahwa ini adalah eksperimental, setidaknya; Saya tidak tahu statusnya saat ini.

Oleh karena itu, untuk basis data produksi kami, jangan disetel hibernate.hbm2ddl.auto - defaultnya adalah tidak membuat perubahan basis data. Sebagai gantinya, kami secara manual membuat skrip pembaruan DDL SQL yang menerapkan perubahan dari satu versi ke versi berikutnya.


141
2018-01-13 08:11



Saya akan menggunakan liquibase untuk memperbarui db Anda. Fitur pembaruan skema hibernate benar-benar hanya o.k. untuk pengembang saat mereka mengembangkan fitur baru. Dalam situasi produksi, upgrade db harus ditangani dengan lebih hati-hati.


50
2018-03-23 07:40



Meskipun pos cukup lama tetapi karena saya melakukan beberapa penelitian tentang topik sehingga berpikir untuk membagikannya.

hibernate.hbm2ddl.auto

Sesuai dokumentasi itu dapat memiliki empat nilai yang valid:

buat | pembaruan | memvalidasi | buat-jatuhkan

Berikut adalah penjelasan tentang perilaku yang ditunjukkan oleh nilai ini:

  • membuat : - buat skema, data yang sebelumnya ada (jika ada) di skema hilang
  • perbarui: - perbarui skema dengan nilai yang diberikan.
  • memvalidasi: - memvalidasi skema. Itu tidak mengubah DB.
  • buat-jatuhkan: - buat skema dengan menghancurkan data yang sebelumnya ada (jika ada). Ini juga menjatuhkan skema database ketika SessionFactory ditutup.

Berikut adalah poin-poin penting yang perlu diperhatikan:

  • Dalam kasus memperbarui, jika skema tidak ada dalam DB maka skema dibuat.
  • Dalam kasus mengesahkan, jika skema tidak ada di DB, itu tidak dibuat. Sebaliknya, itu akan melempar kesalahan: - Table not found:<table name>
  • Dalam kasus buat-jatuhkan, skema tidak dijatuhkan pada penutupan sesi. Turun hanya pada penutupan SessionFactory.
  • Dalam kasus jika saya memberikan nilai apa pun ke properti ini (katakanlah abc, daripada di atas empat nilai yang dibahas di atas) atau hanya dibiarkan kosong. Ini menunjukkan perilaku berikut:

    -Jika skema tidak ada dalam DB: - Ini menciptakan skema

    -jika skema ada di DB: - memperbarui skema.


26
2017-08-07 14:11



hibernate.hbm2ddl.auto secara otomatis memvalidasi dan mengekspor DDL ke skema ketika sessionFactory dibuat.

Secara default, ia tidak melakukan kreasi atau modifikasi secara otomatis pada DB. Jika pengguna menetapkan salah satu nilai di bawah maka itu melakukan skema DDL berubah secara otomatis.

  • buat - lakukan pembuatan skema

    <entry key="hibernate.hbm2ddl.auto" value="create">
    
  • memperbarui - memperbarui skema yang ada

    <entry key="hibernate.hbm2ddl.auto" value="update">
    
  • memvalidasi - memvalidasi skema yang ada

    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
  • buat-jatuhkan - buat dan jatuhkan skema secara otomatis saat sesi dimulai dan berakhir

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    

19
2018-05-11 17:26



Saya mendedikasikan a posting blog untuk yang paling umum Hibernate strategi generasi DDL:

  1. Itu hibernate.hbm2ddl.auto="update" nyaman tetapi kurang fleksibel jika Anda berencana menambahkan fungsi atau menjalankan beberapa skrip khusus.
  2. Itu pendekatan paling fleksibel adalah untuk digunakan Jalur Terbang.

Namun, meskipun Anda menggunakan Flyway, Anda masih bisa menghasilkan skrip migrasi awal menggunakan hbm2ddl. Di artikel ini, Anda dapat melihat bagaimana Anda dapat menggabungkan Model Entitas JPA dengan Model Tabel jOOQ.


16
2018-05-15 12:46



Jika Anda tidak ingin menggunakan Strings di aplikasi Anda dan mencari konstanta yang telah ditetapkan sebelumnya, lihatlah org.hibernate.cfg.AvailableSettings kelas termasuk dalam Hibernate JAR, di mana Anda akan menemukan konstanta untuk semua kemungkinan pengaturan. Dalam kasus Anda misalnya:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

15
2018-02-10 09:56



Saya pikir Anda harus berkonsentrasi pada

SchemaExport Class 

Kelas ini Membuat Konfigurasi Anda Dinamis Jadi ini memungkinkan Anda memilih suite apa pun yang terbaik ...

Periksa [SchemaExport]


7
2018-06-21 02:12



Sejak 5.0, sekarang Anda dapat menemukan nilai-nilai tersebut dalam dedicated Enum: org.hibernate.boot.SchemaAutoTooling (ditingkatkan dengan nilai NONE sejak 5.2).

Atau lebih baik lagi, sejak 5.1, Anda juga bisa menggunakan org.hibernate.tool.schema.Action  Enum yang menggabungkan tindakan JPA 2 dan "warisan" Hibernate DDL.

Tapi, Anda belum bisa mengonfigurasi DataSource secara terprogram dengan ini. Akan lebih baik menggunakan kombinasi ini org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO tetapi kode saat ini mengharapkan String nilai (kutipan diambil dari SessionFactoryBuilderImpl):

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

... dan internal enum nilai keduanya org.hibernate.boot.SchemaAutoToolingdan org.hibernate.tool.schema.Action tidak terbuka untuk umum.

Di bawah ini, sebuah contoh program DataSourcekonfigurasi (digunakan dalam aplikasi Spring Boot saya) yang menggunakan judi berkat .name().toLowerCase() tetapi hanya bekerja dengan nilai tanpa tanda hubung (tidak create-drop contohnya):

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

    Map<String, Object> 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();
}

3
2017-08-11 10:45



validate: Ini memvalidasi skema dan tidak membuat perubahan ke DB.
Asumsikan Anda telah menambahkan kolom baru dalam file pemetaan dan melakukan operasi insert, itu akan melemparkan Pengecualian "hilang XYZ kolom" karena skema yang ada berbeda dari objek yang akan Anda sisipkan. 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 akan mengabaikan menambahkan kolom tertentu ke DB. Karena Tabel harus kosong jika Anda ingin menambahkan kolom 'NOT NULL' ke tabel yang ada.


3
2017-10-15 14:44