Hibernate'i yaklaşık 8 yıl boyunca projelerimin çoğunda kullandıktan sonra, kullanımını engelleyen ve uygulamaların yalnızca DB ile depolanan prosedürler aracılığıyla etkileşime girmesini isteyen bir şirkete indim.
Bunu birkaç hafta yaptıktan sonra, oluşturmaya başladığım uygulamanın zengin bir etki alanı modeli oluşturamadım ve uygulama sadece (korkunç) bir işlem komut dosyası gibi gözüküyor.
Bulduğum bazı konular:
- Saklı yordamlar yalnızca minimum miktarda veri yüklediğinden, nesne grafiği gezinilemiyor, bu da bazen farklı alanlara sahip benzer nesnelerimiz olduğunu gösteriyor. Bir örnek: tüm verileri müşteriden almak için saklı bir prosedürümüz var, diğeri ise hesap bilgilerini ve müşteriden birkaç alanı almak için.
- Mantığın çoğu yardımcı sınıflarda sona ermektedir, bu nedenle kod daha yapılandırılmıştır (eski C yapıları olarak kullanılan varlıklar ile).
- Daha sıkıcı iskele kodu, sonuç kümelerini saklı bir yordamdan ayıklayan ve bir varlık içine koyan hiçbir çerçeve olmadığı için.
Benim sorularım:
- Herhangi biri benzer bir durumda mıydı ve mağaza prosedürü yaklaşımına katılmıyor mu? ne yaptın?
- Saklı yordamları kullanmanın gerçek bir yararı var mı? aptal noktadan başka "hiç kimse bir damla tablo yayınlayamaz".
- Saklı yordamları kullanarak zengin bir etki alanı oluşturmanın bir yolu var mı? DAO'ları / Depoları nesne grafiği üzerinde gezinmek için varlıklara enjekte etmek için AOP kullanma olasılığının olduğunu biliyorum. Bu seçeneği sevmedim, çünkü vudu yakın.
Sonuç
İlk olarak, cevaplarınız için hepinize teşekkür ederim. Geldiğim sonuç, ORM'lerin Zengin Etki Alanı modellerinin oluşturulmasını sağlamadığı (bazı kişilerin söylediği gibi), ancak (genellikle tekrarlayan) çalışma miktarını basitleştirdiğidir. Aşağıdaki, sonucun daha ayrıntılı bir açıklamasıdır, ancak herhangi bir katı veriye dayanmamaktadır.
Çoğu uygulama, diğer sistemlere bilgi talep eder ve gönderir. Bunu yapmak için, model terimlerinde bir soyutlama yaratırız (örneğin bir iş etkinliği) ve etki alanı modeli olayı gönderir veya alır. Etkinlik genellikle modelden küçük bir bilgi alt kümesine ihtiyaç duyar, ancak tüm model için değil. Örneğin, bir çevrimiçi mağazada, bir ödeme ağ geçidi bir kullanıcı için ücret talep etmek için bazı kullanıcı bilgilerini ve toplamı ister, ancak satın alma geçmişi, kullanılabilir ürünler ve tüm müşteri tabanını gerektirmez. Dolayısıyla, etkinliğin küçük ve özel bir veri kümesi var.
Bir uygulamanın veritabanını harici bir sistem olarak alırsak , Etki Alanı Modeli varlıklarını veritabanına eşleştirmemizi sağlayan bir soyutlama oluşturmamız gerekir ( NimChimpsky'nin dediği gibi , bir veri eşleyicisi kullanarak). Açık olan fark şu ki, her bir model varlık için veritabanına bir harita oluşturmaya ihtiyacımız var (ya eski bir şema ya da saklı yordamlar), ikisi eşzamanlı olmadığından, bir etki alanı parçasının kısmen eşleşebileceği için fazladan acı çekiyor. Bir veritabanı varlığına (örneğin, yalnızca kullanıcı adı ve şifreyi içeren bir UserCredentials sınıfı) diğer sütunlara sahip bir Kullanıcılar tablosuna eşlenir) veya bir etki alanı modeli öğesi birden fazla veritabanı varlığına (örneğin bire bir varsa) eşlenebilir masada bir eşleme, ancak tüm verileri sadece bir sınıfta istiyoruz).
Birkaç varlığa sahip bir uygulamada, varlıkları çaprazlamak gerekmiyorsa, fazladan iş miktarı az olabilir, ancak varlıkları geçmek için şartlı bir ihtiyaç olduğunda artar (ve böylece bir çeşit tembel uygulamak isteyebiliriz) Yükleniyor'). Bir uygulama daha çok varlığa sahip olmak için büyüdükçe, bu çalışma artar (ve doğrusal olmayan bir şekilde arttığı hissine sahibim). Buradaki varsayım, bir ORM'yi yeniden icat etmeye çalışmadığımızdır.
Veritabanını harici bir sistem olarak ele almanın bir yararı, içinde çalışan bir uygulamanın 2 farklı versiyonunu istediğimiz durumları kodlayabilmemizdir. Bu, üretime sürekli teslimat senaryosunda daha ilginç hale geliyor ... ama bunun ORM'lerle daha az ölçüde mümkün olduğunu düşünüyorum.
Veritabanına erişimi olmasa bile, bir geliştiricinin bir sistemde depolanan tüm bilgileri almasa bile, yalnızca kötü amaçlı kodları enjekte ederek (ör. Müşterilerin kredi kartı detaylarını kaydeden satırı kaldırmayı unuttuğuma inanamıyorum, sevgili lordum! ).
Küçük güncelleme (6/6/2012)
Saklı yordamlar (en azından Oracle'da) Sıfır kesinti süresinde sürekli teslimat gibi bir şey yapmayı önler, çünkü tabloların yapısındaki herhangi bir değişiklik prosedürleri ve tetikleyicileri geçersiz kılar. Böylece, DB güncellenirken, uygulama da azalacaktır. Oracle, Sürüme Dayalı Yeniden Tanımlama adı verilen bir çözüm sunar , ancak bu özellik hakkında sorduğum birkaç DBA, bunun kötü bir şekilde uygulandığını ve üretim DB'sine koymadıklarını belirtti.