2013-08-30 23 views
5

Uygulama bir makinede ilk defa çalıştırıldığında, Hazırda Beklet'in tüm tablo şemalarını oluşturduğu bir uygulamam var. Bu güzel çalışıyor.Hibernate'in otomatik şema oluşturma ve veritabanı sürüm oluşturma özelliğini birleştirin

Şimdi, Hibernate'in veritabanını sürüm denetimi altında tutmak için bir çeşit mekanizmaya sahip olup olmadığını merak ediyorum, örneğin, uygulamanızın farklı bir sürümünü çalıştırdığımda Hibernate, bir şemayı diğerine nasıl geçireceğimi bilir ve Hazırda Bekletme farklı bir veritabanı bulur eski bir sürümü mevcut şema? Hibernate'in varolan şemayı okuyabileceğini ve şemayı haritalandırma açıklamasında karşılaştırabileceğini düşünürsek, bunun mümkün olabileceğini düşünüyorum. Ancak, hazırda bekletme komutları oluştururken olduğu gibi, eski verileri Google'a taşımaya nasıl anlatabileceğimi bilmiyorum. Liquibase/Flyway.

Hazırda bekletme ve sürüm oluşturma, denetleme ve alan sürümleme konusunda birçok isabet göstereceğinden, doğru şeyleri kullanmayabilirdim ancak Liquibase/Flyway tür sürümleri açısından daha fazlasını düşünüyorum. Her ikisini birlikte düşünmedim, fakat Hazırda Bekletme komut dosyaları oluşturmaz, ancak veritabanını doğrudan manipüle ettiğinden, her ikisinin birlikte nasıl çalışacağını bilemezdim.

Bu, hazırladığımda, kendi yazımlarımı yazmak yerine Hibernate'in şemayı oluşturmasına izin verdiğim ilk sefer. Ben manuel script oluşturma ekstra sıkıcı yapan Hibernate Envers yararlanmak için bunu yapıyorum. Belki bariz bir şey eksik. Bu konudaki herhangi bir giriş için teşekkürler! Güncelleştirme: Bugün Flyway'in geliştiricisi ile konuşmalıyım ve bana iyi bir çözüm bilmeyeceğini söylemişti. Belki hiçbir şey yok mu?

+0

Hibernate, bunu yapmaya çalışacak bir "update" hbm2ddl.auto değerine sahiptir, ancak güvenilir değildir. Hazırda bekletme deneyimlerimde, bu şema güncelleştirmelerinin her zaman elle yazılan şema güncelleme sql komut dosyaları kullanılarak ele alınması gerekir.Genelde uygulamanın kullandığı db kullanıcısı, bu durumda sizin durumunuza uygun olmasa bile, oluşturma/bırakma ayrıcalıklarına sahip olmamalıdır. – Taylor

+0

Benim düşünceme göre, şema yazımı, Java nesnelerini uygulayarak zaten tanımlanmış bir etki alanı modelini simly olarak yansıttığından, bir çeşit kod çoğaltmasıdır. Genellikle, bu çoğaltma o kadar pahalı değil, ama Envers ile. Bu yüzden bunun için bir çözümüm olmasını isterdim. Hangi bağlamda hbm2dll.auto yetersiz kalıyordu. Özel bir Flyway göçmenini uygulamak için harika bir giriş noktası olabilir. –

+0

Neredeyse her bağlam. Mevcut sütunların yeniden düzenlenmesi veya "tek bir varsayılan değere sahip sütun ekle" veya "bu sütunu kaldır" dışındaki herhangi bir değişiklik, hazırda bekletme için hazırda bekletme yeteneğinin ötesindedir. – Taylor

cevap

8

Java/Hazırda Bekletme projemizle aynı sorunu yaşıyorduk ve herhangi bir kod çoğaltma çalışması istemiyordu. Hazırda bekletme "güncelleme" özelliği hiç de güvenilir değil, LiquidBase daha iyi ama% 100 fool kanıtı değil.

  1. "geçerli" veritabanı şeması her zaman doğrudan bir DEV veritabanına karşı hazırda, tarafından oluşturulur: Sonunda şu sürecini yönetmek için basit kodu geliştirdi.
  2. Bir "önceki" veritabanı şeması, bir dizi LiquiBase değişiklik kümesi tarafından oluşturulan şeklindedir.
  3. bir göç, bir LiquiBase "fark" fonksiyonu yeni LiquiBase değişim setini üreten "önceki" ve "geçerli" veritabanları (iki gerçek veritabanları, evet, daha güvenilir bu şekilde) arasında çağrılır ihtiyaç vardır her zaman .
  4. Bu ayar kümesinin manuel olarak gözden geçirilmesi gerekir. Tüm değişiklik setleri kaynak kod kontrolünde tutulur.
  5. PRODUCTION veritabanının, tüm LiquiBase değişiklik kümelerini uygulayarak oluşturduğu şeması vardır. Bizim komut

kilit komutu aşağıdaki gibi okur:

${LIQB_COMMAND} ${PREV_DB_OPTIONS} --changeLogFile=${LIQB_CHGLOG_FILE_NEW} \ 
    diffChangeLog \ 
       --referenceUsername=${DEV_DB_USER} \ 
       --referencePassword=${DEV_DB_PWD} \ 
       --referenceDriver=com.mysql.jdbc.Driver \ 
       --referenceUrl=${DEV_DB_URL} 

Bu şekilde, bizim göç süreci oldukça güvenilir olduğunu ve iki kez şema kodunu yazmayın. XML'de oluşturulan değişikliklerin manuel olarak gözden geçirilmesi vardır, ancak çoğu zaman sorun yoktur ve şema değiştirme işlemlerini el ile yazmaktan çok daha kolaydır.

+0

Evet. Liquibase kullanmak istediğiniz şeydir. Hibernate'in auto-ddl özelliği öncelikle bir dev/test aracıdır. Eminim ki bu, en iyi Hazırda Bekletilen kitaplarda bahsedildiğinden eminim, bu yüzden millet neden üretim şema geçişini yapmak için auto-ddl kullanmayı denediğinden emin değilim. –

+0

Çünkü uygun, sanırım. Ama böyle bir çözüme doğru gitmem gerektiğini düşündüm. Çözümünüzü açık kaynak haline getirmediniz mi? –

+0

Biliyorsunuz, aslında bunu yapmaya aldırmam. Kodun sadece bu kısmı projemize gömülü. Daha fazla temizlemek ve sizin ve başkaları için yararlı hale getirmek için biraz çaba sarf edeceğim. Rotadan geçmek istediğinizden emin olabilirsiniz ve belki de başkalarına yararlı hale getirmek için kodu temizlemeye yardımcı olabilirsiniz. – stevel

İlgili konular