Hibernate hbm2ddl.auto yapılandırmasının olası değerleri nelerdir ve ne yaparlar


1085

Güncelleme, dışa aktarma ve verilebilecek değerler hakkında daha fazla bilgi edinmek istiyorum. Güncellemeyi hibernate.hbm2ddl.auto
ne zaman ve ne zaman kullanacağımı bilmem gerekir? Ve alternatifi nedir?

Bunlar DB üzerinden gerçekleşebilecek değişikliklerdir:

  • yeni tablolar
  • eski tablolardaki yeni sütunlar
  • sütunlar silindi
  • bir sütunun veri türü değişti
  • bir sütun türü özelliklerini değiştirdi
  • tablolar düştü
  • bir sütunun değerleri değişti

Her durumda en iyi çözüm nedir?

Yanıtlar:


1083

Gönderen topluluk belgelerine :

hibernate.hbm2ddl.auto SessionFactory oluşturulduğunda şema DDL'sini veritabanına otomatik olarak doğrular veya dışa aktarır. Create-drop ile, veritabanı şeması SessionFactory açıkça kapatıldığında bırakılır.

örneğin validate | güncelleme | oluştur | create-damla

Olası seçenekler listesi,

  • validate : şemayı doğrular, veritabanında değişiklik yapmaz.
  • güncelleme : şemayı güncelle.
  • create : önceki verileri yok ederek şemayı oluşturur.
  • create-drop : SessionFactory açıkça kapatıldığında, genellikle uygulama durdurulduğunda şemayı bırakın.
  • none : şema ile hiçbir şey yapmaz, veritabanında değişiklik yapmaz

Bu seçenekler, geliştirici araçları gibi görünmektedir ve herhangi bir üretim seviyesi veritabanını kolaylaştırmamak için aşağıdaki soruya göz atmak isteyebilirsiniz; Hazırda Bekletme: hbm2ddl.auto = üretimde güncelleme var mı?


14
Geçerli değerler için hazırda bekletme belgesini okuyun, şöyle diyor: "örneğin" ... başka geçerli değerler var mı?
Ta Sas

16
Bence "mesela" der, çünkü bu sadece bir topluluk dokümanıdır, eğer birisi olası tüm değerlerle ilgileniyorsa, Hibernate'in javadoc'unda bulunabilir. (Ve evet, sadece bu dört seçenek mevcuttur) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
szegedi

4
validate şemayı doğrula diyor, tam olarak ne demek ??
Hussain Akhtar Wahid 'Ghouri'

6
Hazırda bekletme modunun hiçbir şey yapmamasını istiyorsanız, 'aardvark' veya 'güvercin' veya başka bir kelime de kullanabilirsiniz. Tabii ki tavsiye ederim değil!
Ward

2
Oluştur-bırak seçeneğine küçük bir ekleme. Bu seçenek kullanılırsa, tüm şemayı düşürmez, bunun yerine eşlemeleri bu sırada kullanılabilir olan tabloları bırakır. Örneğin, Şema S'ye sahip bir veritabanında A, B, C tabloları ve java kodunda yalnızca A ve B eşlemeleri varsa, Hazırda Beklet, C tablosunu
Aditya

194

Ayrıca tamamen devre dışı bırakmak için belgesiz "none" değeri de vardır.


7
Hibernate'in şema doğrulaması bazen mükemmel şekilde geçerli şemalar için başarısız olduğundan bu aslında oldukça yararlıdır.
Michael Piefel

Tam böyle bir şey istemek üzereydim. Amacım başlangıç ​​zamanını azaltmak.
digao_mb

46
'boş dize', 'hiçbiri'nden daha iyidir . Kullanım 'none' için, uyarı mesajı alırsınız: org.hibernate.cfg.SettingsFactory - Tanınmayan değer "hibernate.hbm2ddl.auto" için: none
okwap

14
Yama yaptým. Açıkça geçerli bir sabit olarak "none" eklendi.
Sanne

9
Ben diğerleri üzerinde "hibernate.hbm2ddl.auto = patates" seviyorum stackoverflow.com/a/15810379/838444
Sneg

161

Configuration özelliği çağrılır hibernate.hbm2ddl.auto

Geliştirme ortamımızda hibernate.hbm2ddl.auto=create-drop, her dağıttığımızda temiz bir veritabanı bırakmaya ve oluşturmaya ayarladık , böylece veritabanımız bilinen bir durumda.

Teorik olarak, hibernate.hbm2ddl.auto=updateveritabanınızı modelinizdeki değişikliklerle güncellemeyi ayarlayabilirsiniz , ancak bir üretim veritabanında buna güvenmem. Belgelerin daha önceki bir sürümü, bunun en azından deneysel olduğunu söyledi; Mevcut durumu bilmiyorum.

Bu nedenle, üretim veritabanımız için ayarlamayın hibernate.hbm2ddl.auto- varsayılan, veritabanı değişikliği yapmamaktır . Bunun yerine, bir sürümden diğerine değişiklikler uygulayan bir SQL DDL güncelleme komut dosyası el ile oluştururuz.


5
Aslında, dokümantasyona göre create-drop, veritabanı tablolarını oluşturur ve oturum fabrikası açıkça kapatıldığında bunları bırakır. O mu değil oturumu fabrika oluşturulduğunda tabloları bırakın.
Frans

4
Hayır, sessionfactory oluşturulduğunda hem create-drop hem de create tabloları bırak, sonra sessionfactory kapatıldığında create-drop tabloları da bırakır. Bkz. Stackoverflow.com/a/6752698/1536382
Testo Testini

hibernate.hbm2ddl.auto = üretimde düşüş yaratma, üretimde birkaç bağlantı zaman aşımına neden olabilir mi?
METTAIBI

51

Ben senin db güncellemek için liquibase kullanırdım . hibernate'in şema güncelleme özelliği, yeni özellikler geliştirirken yalnızca bir geliştirici için uygundur. Bir üretim durumunda, db yükseltmesinin daha dikkatli bir şekilde ele alınması gerekir.


6
Bkz stackoverflow.com/questions/221379/... Eğer üretim için hbm2ddl kullanmamalısınız niçin.
Nathan Voxland

51

Oldukça eski bir yazı olmasına rağmen ama konu hakkında bazı araştırmalar yaptığım için bunu paylaşmayı düşündüm.

hibernate.hbm2ddl.auto

Belgelere göre dört geçerli değere sahip olabilir:

oluştur | güncelleme | onayla | create-damla

Bu değerle gösterilen davranışın açıklaması aşağıdadır:

  • create : - şemayı oluştur, daha önce şemada mevcut olan veriler kaybolur
  • update: - şemayı verilen değerlerle güncelleyin.
  • validate: - şemayı doğrulayın. DB'de hiçbir değişiklik yapmaz.
  • create-drop: - daha önce mevcut olan verileri (varsa) yok ederek şemayı oluşturun. SessionFactory kapatıldığında veritabanı şemasını da bırakır.

Dikkat çekmeye değer önemli noktalar şunlardır:

  • Güncelleme durumunda, şema DB'de yoksa, şema oluşturulur.
  • Doğrulama durumunda, DB'de şema yoksa, oluşturulmaz. Bunun yerine, bir hata atar: -Table not found:<table name>
  • Oluşturma-bırakma durumunda , oturum kapatıldığında şema bırakılmaz. Yalnızca SessionFactory kapatıldığında düşer.
  • Bu özelliğe herhangi bir değer verirseniz (yukarıda tartışılan dört değerin yerine abc diyelim) veya sadece boş bırakılırsa. Aşağıdaki davranışı gösterir:

    -Şema DB'de yoksa: - Şemayı oluşturur

    -Şema DB'de varsa: - şemayı güncelleyin .


Şema mevcut değilse, "güncelleme" kullanıldığında oluşturulacağı çok önemli bir noktadır.
yuranos

"Davranışın açıklaması" ve "Önemli Noktalar" ifadeleri karşılaştırılırken create-drop ile çelişir.
VNT

2
Update ve empty arasındaki fark nedir ?
yashjain12yj

46

İlk olarak, hbm2ddlconfiguration özelliği için olası değerler şunlardır:

  • none- İşlem yapılmaz. Şema oluşturulmaz.
  • create-only - Veritabanı şeması oluşturulacaktır.
  • drop - Daha sonra veritabanı şeması kaldırılacak ve oluşturulacaktır.
  • create - Daha sonra veritabanı şeması kaldırılacak ve oluşturulacaktır.
  • create-drop- Daha sonra veritabanı şeması kaldırılacak ve oluşturulacaktır. The kapatıldığında, SessionFactoryveritabanı şeması bırakılacaktır.
  • validate - Veritabanı şeması varlık eşlemeleri kullanılarak doğrulanacaktır.
  • update - Veritabanı şeması, var olan veritabanı şemasının varlık eşlemeleriyle karşılaştırılmasıyla güncellenir.

En yaygın Hibernate DDL oluşturma stratejileri için bir blog yazısı ayırdım :

  1. hibernate.hbm2ddl.auto="update"Eğer bazı özel komut işlevleri ekleyerek veya yürütme planlıyorsanız kullanışlı ancak daha az esnektir.
  2. En esnek yapı kullanmaktır Flyway .

Ancak, Flyway kullansanız bile, ilk geçiş komut dosyasını hbm2ddl kullanarak oluşturabilirsiniz. Gelen bu makalede , size jOOQ Tablo Modeli ile JPA varlık Modeli birleştirebilirsiniz nasıl görebilirsiniz.


27

hibernate.hbm2ddl.auto sessionFactory oluşturulduğunda DDL'yi otomatik olarak şemaya doğrular ve dışa aktarır.

Varsayılan olarak, DB üzerinde otomatik olarak herhangi bir oluşturma veya değişiklik yapmaz. Kullanıcı aşağıdaki değerlerden birini ayarlarsa, otomatik olarak DDL şema değişiklikleri yapar.

  • create - şema oluşturmayı yapıyor

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • güncelleme - mevcut şemayı güncelleme

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • validate - mevcut şemayı doğrula

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - bir oturum başlatıldığında ve bittiğinde şemayı otomatik olarak oluşturup bırakın

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

2
<giriş anahtarı = "hibernate.hbm2ddl.auto" value = "none"> ne olacak?
VNT

17

Uygulamanızda Dizeler kullanmak istemiyorsanız ve önceden tanımlanmış sabitler arıyorsanız org.hibernate.cfg.AvailableSettings, olası tüm ayarlar için bir sabit bulabileceğiniz Hazırda Beklet JAR'da bulunan sınıfa göz atın . Örneğin sizin durumunuzda:

/**
 * 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";

5
Neden neredeyse 500 vole up ile düz cevap üzerinde 700 + satır uzun kaynak dosya referans?
Pavel Niedoba

... bu sorunun bir anlamı yok. Neden bir şeyler var? Ben neden burdayım ki?
uzmanlaşmak

8
  • validate: şemayı doğrular, veritabanında hiçbir değişiklik olmaz.
  • update: şemayı geçerli yürütme sorgusuyla günceller.
  • create: her seferinde yeni şema oluşturur ve önceki verileri yok eder.
  • create-drop: uygulama durdurulduğunda veya SessionFactory açıkça kapatıldığında şemayı düşürür.

'Resmi' dokümantasyon referansı nedir? - sadece merak ediyorum ...
Dirk Schumacher

7

Bence

SchemaExport Class 

bu Sınıf Yapılandırmanızı Dinamik Hale Getirir Böylece size en uygun olanı seçmenizi sağlar ...

Ödeme [SchemaExport]


4

validate: Şemayı doğrular ve DB'de değişiklik yapmaz.
Eşleme dosyasına yeni bir sütun eklediğinizi ve ekleme işlemini gerçekleştirdiğinizi varsayalım, mevcut şema ekleyeceğiniz nesneden farklı olduğu için "XYZ sütununu eksik" bir İstisna atar. Bu yeni sütunu manuel olarak ekleyerek tabloyu değiştirirseniz, Ekle işlemini gerçekleştirirseniz, yeni sütunla birlikte tüm sütunları Tabloya kesinlikle ekleyecektir. Mevcut şemada / tabloda değişiklik yapmadığı / değiştirmediği anlamına gelir.

update: işlemi gerçekleştirdiğinizde veritabanındaki varolan tabloyu değiştirir. Bu hbm2ddl seçeneği ile sütun ekleyebilir veya kaldırabilirsiniz. Ancak, 'NULL DEĞİL' olan yeni bir sütun ekleyecekseniz, o sütunu DB'ye eklemeyi yoksayar. Çünkü varolan tabloya 'NULL DEĞİL' sütunu eklemek istiyorsanız, Tablo boş olmalıdır.


3

5.0'dan bu yana , artık bu değerleri özel olarak bulabilirsiniz Enum: org.hibernate.boot.SchemaAutoTooling(5.2'den NONEbu yana geliştirilmiş değerle ).

Veya daha da iyisi, 5.1'den beri JPA 2 ve "eski" Hazırda Bekletme DDL işlemlerini birleştiren olanı da kullanabilirsiniz .org.hibernate.tool.schema.Action Enum

Ancak , bununla henüz DataSourceprogramlı olarak yapılandıramazsınız . Bununla birlikte kullanmak daha iyi olurdu, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOancak mevcut kod bir Stringdeğer bekliyor (alıntıdan alınmıştır SessionFactoryBuilderImpl):

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

... ve iç enumhem değerleri org.hibernate.boot.SchemaAutoToolingve org.hibernate.tool.schema.Actionkamuya açık değildir.

Aşağıda, DataSourcesayesinde bir gambit kullanan örnek bir programlı yapılandırma (Spring Boot uygulamalarımda kullanılır), .name().toLowerCase()ancak yalnızca tire olmayan değerlerle çalışır ( create-dropörneğin değil ):

@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();
}

0

Varsayılan değeri kimin arayacağı ...

Spring-boot 2.0.5 ve JpaProperties 1.1.0 sürümlerinde kaynak kodunda yazılmıştır:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.