Hibernate, EclipseLink, Toplink, OpenJPA ve diğerlerini içeren JPA (Java Persistence API, temelde Java / J2EE / EJB için standart ORM API) ile çalışmak için biraz zaman harcayan biri olarak konuşurken, gözlemler.
- ORM'ler hızlı değildir. Yeterli olabilir ve çoğu zaman yeterli olur, ancak yüksek hacimli düşük gecikmeli bir ortamda hayır-hayırdır;
- Java ve C # gibi genel amaçlı programlama dillerinde, onları çalıştırmak için çok fazla sihire ihtiyacınız vardır (örneğin, Java'da yükleme zamanı dokuma, enstrümantasyon, vb.);
- Bir ORM kullanırken, SQL'den (amaç gibi görünüyor) uzaklaşmak yerine, ORM'nizin performans SQL'i üretmesini sağlamak için XML ve / veya ek açıklamaları / nitelikleri ayarlamak için ne kadar zaman harcadığınıza şaşıracaksınız;
- Karmaşık sorgular için, gerçekten bir yedek yoktur. JPA'da olduğu gibi, sadece ham SQL'de mümkün olmayan bazı sorgular vardır ve JPA'da ham SQL kullanmanız gerektiğinde güzel değildir (C # /. Net en azından dinamik türlere sahiptir - var - ki bu çok fazla Object dizisinden daha güzel);
- ORM'leri kullanırken çok fazla "gotchas" var. Buna istenmeyen veya beklenmedik davranışlar da dahildir, veritabanınıza SQL güncellemeleri yapabilme yeteneğini (JPA veya benzer yöntemlerde refresh () kullanarak) oluşturmanız gerekir, çünkü JPA varsayılan olarak her şeyi önbelleğe alır, böylece doğrudan bir veritabanını yakalamaz güncelleme - doğrudan SQL güncellemelerini çalıştırmak yaygın bir üretim destek faaliyetidir);
- Nesne-ilişkisel uyumsuzluk her zaman sorun yaratacaktır. Böyle bir sorunla soyutlamanın karmaşıklığı ve bütünlüğü arasında bir denge vardır. Zaman zaman JPA'nın çok ileri gittiğini ve isabetin karmaşıklığının soyutlama ile haklı olmadığı gerçek bir azalan getiriler yasasına çarptığını hissettim.
Biraz daha açıklama gerektiren başka bir sorun daha var.
Bir Web uygulaması için geleneksel model, bir kalıcılık katmanına ve bir sunum katmanına sahip olmaktır (muhtemelen bir hizmet veya diğer katmanlar arasında olmakla birlikte, bunlar bu tartışma için önemli ikidir). ORM'ler kalıcılık katmanınızdan sunum katmanına (yani varlıklarınıza) katı bir görünümü zorlar.
Daha ham SQL yöntemlerinin eleştirilerinden biri, tek bir sorgu tarafından kullanılan tüm bu VO'lara (değer nesneleri) veya DTO'lara (veri aktarım nesneleri) sahip olmanızdır. Bu, ORM'lerin bir avantajı olarak lanse edilir, çünkü bundan kurtulursunuz.
Bu problemler ORM'lerde ortadan kalkmıyor, sadece sunum katmanına geçiyorlar. Sorgular için VO'lar / DTO'lar oluşturmak yerine, genellikle her görünüm için bir tane olmak üzere özel sunum nesneleri oluşturursunuz. Bu nasıl daha iyi? IMHO değil.
Bunu ORM veya SQL'de yazdım : Henüz orada değil miyiz? .
Bugünlerde tercih ettiğim inat teknolojisi (Java'da) ibatis. JPA'nın yapabileceği şeylerin% 90'ını + yapan çok ince bir sarıcıdır (iyi belgelendirilmemiş olmasına rağmen ilişkilerin tembel yüklemesini bile yapabilir) ancak çok daha az yük ile (karmaşıklık ve gerçek kod açısından).
Bu geçen yıl yazdığım bir GWT başvurusunda ortaya çıktı. EclipseLink'ten hizmet uygulamasında sunum nesnelerine çok sayıda çeviri. Eğer ibatis kullanıyor olsaydık, ibatis ile uygun nesneleri yaratmak ve daha sonra yığını yukarı ve aşağı doğru geçirmek çok daha kolay olurdu. Bazı saflar bunun Bad ™ olduğunu iddia edebilirler. Belki de (teoride) ama size şunu söyleyeyim: daha basit bir kod, daha basit bir yığın ve daha fazla üretkenlik yaratırdı.