Spring.jpa.hibernate.ddl-auto özelliği Bahar'da tam olarak nasıl çalışır?


130

Spring boot uygulama projem üzerinde çalışıyordum ve bazen başka bir sunucuda (SQL Server) Veritabanımda bağlantı zaman aşımı hatası olduğunu fark ettim. Bu, özellikle bazı komut dosyası geçişi yapmaya çalıştığımda oluyor, FlyWayancak birkaç denemeden sonra çalışıyor.

Daha sonra spring.jpa.hibernate.ddl-autoözellikler dosyamda belirtmediğimi fark ettim . Biraz araştırma yaptım ve spring.jpa.hibernate.ddl-auto= create-dropgeliştirmeye eklemenin tavsiye edildiğini gördüm . Ve şu şekilde değiştirin: spring.jpa.hibernate.ddl-auto= noneüretimde.

Ama aslında nasıl çalıştığını ve hibernate'in veritabanı şemasını create-dropveya nonedeğerini kullanarak nasıl oluşturduğunu anlamadım . Lütfen teknik olarak nasıl çalıştığını ve bu özelliğin geliştirmede ve üretim sunucusunda kullanılması için önerilerin neler olduğunu açıklayabilir misiniz? teşekkür ederim


1
FWIW JPA 2.1, standart bir javax.persistence.schema-generation.database.action özelliğine sahiptir, bu nedenle şema oluşturmak için JPA satıcısına özgü özellikleri kullanma ihtiyacını gerçekten görmeyin.
Neil Stockton

@NeilStockton Hibernate 6 ile keşfettiğimiz fikirlerden biri, şema oluşturmayı kategorilere göre farklı şekilde kontrol edebilme becerisidir; Örneğin, orm tablolarınız olabilir, noneancak Hazırda Bekletme Arama ve Envers tablolarınızın updatebu projeler tarafından dahili olarak yönetildikleri ve bunları kendiniz elle yönetmek istemediğiniz için kullanılarak oluşturulmasını isteyebilirsiniz. Şu anda bunu kökeni / kaynağı ne olursa olsun tüm tablolar için global olarak kontrol ediyoruz. Bu, eğer bunu kullanmak istiyorsanız, satıcıya özgü seçenekleri kullanma nedenini daha da artıracaktır.
Naros

Yanıtlar:


216

Kayıt için, spring.jpa.hibernate.ddl-autoözellik Spring Data JPA'ya özeldir ve sonunda bildiği özellik altında Hibernate'e geçirilecek bir değer belirleme yoludur hibernate.hbm2ddl.auto.

Değerler create, create-drop, validateve updatetemelde şema aracı yönetimi başlangıçta veritabanı şemasını işlemek nasıl etkiler.

Örneğin, updateişlem, veritabanı meta verilerini almak için JDBC sürücüsünün API'sini sorgular ve ardından Hibernate, açıklamalı sınıflarınızı veya HBM XML eşleştirmelerinizi okumaya dayalı olarak oluşturduğu nesne modelini karşılaştırır ve şemayı anında ayarlamaya çalışır.

updateÖrneğin ameliyat vb yeni sütunlar, kısıtlamaları eklemeye çalışır ancak daha önce var olan ama artık bir önceki seferden gelen nesne modeli bir parçası olarak yapar olabilecek bir sütunu veya kısıtlamayı kaldırmak asla.

Tipik olarak test senaryolarında, create-dropşemanızı oluşturmak için büyük olasılıkla kullanacaksınız , test durumunuz bazı sahte veriler ekler, testlerinizi çalıştırırsınız ve ardından test çalışması temizliği sırasında şema nesneleri bırakılarak boş bir veritabanı bırakılır.

Geliştirme aşamasında, geliştiricilerin updateyeniden başlattıktan sonra yeni eklemeler eklemek için şemayı otomatik olarak değiştirmek için kullandıklarına sıkça rastlanır . Ancak yine anlayın ki, bu artık gerekli olmayan önceki uygulamalardan var olabilecek bir sütunu veya kısıtlamayı kaldırmaz.

Üretimde genellikle nonebu özelliği kullanmanız veya belirtmemeniz şiddetle tavsiye edilir . Bunun nedeni, özellikle veritabanınız birden çok hizmet ve uygulama arasında paylaşılıyorsa, DBA'ların veritabanı değişiklikleri için geçiş komut dosyalarını gözden geçirmeleri yaygın bir uygulamadır.


11
Evet, üretimde asla ddl oluşturma kullanmayın. Tablo yapısı için başlangıç ​​betiklerini ddl kullanarak oluştururuz ve sürece DBA'yı dahil ederiz. Daha sonra db betiklerini dağıtım biriminin bir parçası olarak dahil ediyoruz ve uygulama konuşlandırıldığında Flyway kullanarak bunları yürütüyoruz. Veritabanını değiştirmemiz gerektiğinde, uygulamanın bir sonraki sürümüne yeni betikler ekliyoruz ve aşamalandırmaya dağıtıyoruz. Flyway, mevcut sürümü otomatik olarak algılayacak ve veritabanını en yeni sürüme getirmek için gereken komut dosyalarını çalıştıracaktır. Her şey yolunda giderse üretime dağıtırız.
Klaus Groenbaek

1
ya bu özelliği belirtmezsek? örneğin kendi <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> güncellemem var </prop> buna sahiptim ve bazı nedenlerden dolayı, yukarıda belirtilen özelliği ekleyene kadar tablolarım hep düşürüldü; ps: kod örneği için özür dilerim)
Ţîgan Ion

11
Neden validateÜretim Ortamında değil ?
Shamal Karunarathne

20
@ShamalKarunarathne Uygulamaları validateüretimde kullanabilir , ancak tipik olarak bu, veritabanı taşıma aracınıza yazdığınız veya uyguladığınız veritabanı komut dosyalarının doğru olduğunu doğrulamak için kalite / test ortamınızda kullandığınız bir ayar olmalıdır. Üretimde kullanmamanın bir başka nedeni validate, uygulamanızın başlangıç ​​sürecinde, özellikle nesne modelinizin boyutu oldukça genişse veya ağla ilgili diğer faktörler devreye girerse, bir darboğaz olabileceğidir.
Naros

1
Kesin bir yığın izi olmadan spekülasyon yapmak zordur; ancak, benim ilk tahminim order, SQL ayrıştırıcısı tarafından yanlış yorumlanacağıdır, çünkü bu, eğer öncelenmiyorsa bir anahtar kelimedir.
Naros
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.