ORM (Object Relational Mapping) Nedir?

Java Platform

Herkese merhaba, buralarda yeniyim Medium’u keşfedeli yaklaşık iki sene oldu ancak sadece bir konu hakkında (Bu genellikle yazılım sektörü hakkında olur.) araştırma yapmak için kullanıyordum; bu süre zarfında önceki yıllara nazaran büyük yol katedilmiş olmasına rağmen, halen yazılım dünyasında spesifik ve temel konular hakkında yazılmış yeterince Türkçe kaynağın var olduğunu düşünmüyorum.

Bu durumun İngilizce öğrenimini teşfik edici bir yanı var sektör bunu gerekli kılıyor fakat benim gibi yazılıma yeni giriş yapan geleceğin developer’ları için işler çevirilerle yürümüyor konunun temelini iyi atmak gerekiyor. Dil bilgisi bu evreden sonra detaylar için önem arz ediyor. Ben de öğrendiğim yeni bilgileri bu platformda yazmaya karar verdim öğrendiklerimin böylece daha kalıcı olacağına inanıyorum, hem kendi gelişimim için hem de başkalarının. Şöyle bir sözle giriş yazısını sonlandırmak istiyorum:

“Paylaştıkça azalmayan tek şey bilgidir.”

Asıl konumuza dönecek olursak, bu yazıda JDBC, ORM, JPA ve EJB -Entity Beans konuları hakkında temel bilgilerden bahsedeceğim. (Yersiz bir bilgi İngilizce kelimeden sonra gelen Türkçe ekler kelimenin Türkçe okunuşuna göre eklenir. Örneğin: developer’leri ancak böylesi biraz rahatsız edici olduğu için ben yazılarımda klasik yöntemle devam edeceğim.)

JDBC

ORM’den önce anlaşılması gereken bir konu var: Java Database Connectivity, programımızdan ilişkisel-veritabanlarına (relational database) bir dizi Java API ile erişim sağlar. Bu API’ler Java uygulamalarımızın SQL statement’larının çalıştırılmasını ve SQL uyumlu veritabanları ile iletişimin kurulmasını sağlar. JDBC veritabanından bağımsız uygulamalar yazmamıza imkan veren esnek bir mimaridir. Bu uygulamalar farklı ortam (platform) ve Veritabanı Yönetim Sistemleri (DBMS) ile uyumlu çalışırlar.

Artıları (+)

  • Temiz ve basit SQL sorguları yazabilmemizi sağlar.
  • Geniş ölçekteki verilerin işlenmesinde iyi iş çıkarır.
  • Küçük uygulamalar için idealdir. (Java SE uygulamaları örnek verilebilir.)
  • Basit söz dizimi (syntax) ve kolay öğrenim.

Eksileri (-)

  • Büyük projeleri içinden çıkılamaz hale getirebilir.
  • Daha fazla kod satırı. (LCL - Long Code Line)
  • Encapsulation desteği yoktur.
  • Projeyi MVC mimarisine uyarlamak zordur.
  • Sorgular DBMS’e göre değişkenlik gösterir.

Database CRUD operasyonlarını JDBC altyapısı ile gerçekleştirdiğim Swing projesini GitHub hesabımdan inceleyebilirsiniz:

ORM (Object Relational Mapping)

ORM nesne-ilişkisel uyumsuzluğuna (object-relational mismatching) çözüm olarak tasarlandı. Nesneler ile tablolar arasında persistence işlemini gerçekleştirebilmek için uygulamadaki sınıfların veri tabanındaki tablolara, sınıflarda tanımlanan nesne özelliklerinin yani nesne değişkenlerinin (instance/object variables) de bu tablolardaki sütunlarla/kolonlarla eşleştirilmesi gerekmektedir. Buna da “Nesne-İlişkisel Eşleştirme” (Object-Relational Mapping) denir.

ORM Diagram

ORM kendi başına sadece bir kavramdır (teknik), ORM mantığını uygulayan araçlar (JDBC altyapısından beslenirler.) vardır, bu araçların ortak özellikleri:

1. Mapping: ORM araçlarının temel özelliğidir. Mapping işlemi genel olarak metadata (bir işlemin nasıl yapılacağını tanımlayan parametre/veri hakkında veri) kullanılarak yapılmaktadır. Hibernate aracı (ORM tool) için annotation tabanlı metadatalar kullanılırken bazı araçlarda XML tabanlı metadata kullanılmaktadır. Mapping işlemi yapılırken;

  • Class’lar ile tablolar,
  • Property’ler ile kolonlar,
  • Relation’lar ile foreign key’ler,
  • Primitive tipler ile SQL tipleri eşleştirilir.
Source Code For ORM
SQL Server Table

2. Persistence: ORM araçlarının genel özelliklerinden biri de persistence işlemlerini gerçekleştirmeleridir. Hibernate, veri erişim katmanı (Data Access Layer-DAL) ile veritabanı arasında durur ve uygulama katmanında çalışan yazılımcıları database ile ilgili işlemlerden kurtarır, business logic’e (iş mantığı) odaklanmasını sağlar.

Yazılımcı DAL’da bir object (nesne) oluşturduğunda ORM aracı sayesinde ilgili veritabanı tablosuna da bir satır eklenir, silindiğinde silinir, güncellendiğinde güncellenir. Primary key kullanılarak ilgili satır ilişkili object’e yüklenebilir. Tüm bunlar ORM araçlarının persistence özelliğidir.

3. Query: Birçok ORM aracı veritabanı sorguları için sizi SQL yazmaktan kurtarır. Hibernate’in HQL‘i buna bir örnektir. Aracın sorgulama kütüphaneleri sayesinde SQL yazmadan karmaşık sorgular üretebilir ve kullanabilirsiniz. Bununla birlikte birçok ORM aracı Native SQL yazımını da kısıtlamaz. Yani klasik yöntemi hala kullanabilirsiniz.

Şöyle bir özet geçmek gerekirse ORM:

  • Veritabanı tablolarına ulaşmak yerine verilere, veri katmanı sınıfından erişim sağlar.
  • Kod tekrarını engeller ve daha temiz kod ile veritabanını manipüle eder.
  • Transaction yönetimi ve auto-generated key özelliğini destekler.
  • Inheritance, polymorphism ve encapsulation konseptlerinin veritabanı ile kolaylıkla kullanılabilmesini sağlar.

Günümüzde pek çok Java ORM Framework’ü (aracı) bulunmaktadır bunlardan bazıları:

Enterprise JavaBeans- Entity Beans (EJB), Java Data Objects, TopLink, Spring DAO, Hibernate.

ORM’e giriş niteliğinde, database CRUD operasyonlarını Native - Hibernate altyapısını kullanarak gerçekleştirdiğim sözlük projesini (Swing) GitHub hesabımdan inceleyebilirsiniz:

Böylelikle JDBC ve ORM’in (Hibernate) nasıl işlediğini kavrayıp birbirleri arasındaki farkı daha iyi ayırt edebileceksiniz. Bu arada yazdığım sözlük projesini aktif olarak kullanıyorum :)

JPA (Java Persistence API)

JPA, Java objeleri/sınıfları ile bir ilişkisel veritabanı (relational database) arasında veri erişimi, yönetimi ve persistence işlemi gibi operasyonları tanımlayan bir Java spesifikasyonudur. JPA, EJB 2 CMP (Container Managed Persistence) Entity Beans spesifikasyonu yerine kullanılması amacıyla EJB 3.0 şartnamesinin bir parçası olarak tanımlanmıştır. JPA şu an Java dünyasında ORM için standart bir yaklaşım olarak görülüyor.

Yeri gelmişken şartname/spesifikasyon/specification bir konu hakkında teknik özellikleri (şartları) tanımlayan ifadelerin bütünüdür. Anlamını öğrenmeden yabancı kaynaklarda araştırma yapmaya kalkınca, konuyu yarım anladığımı düşünüyordum. Bu his gerçekten sinir bozucu bir hale gelmişti benim için, başkaları da zorlanmasın diye açıklamak istedim.

Java Persistence API, EJB 2 CMP spesifikasyonu gereğince POJO (Plain Old Java Objects) sınıflarının basit bir şekilde persist edilebilmesini sağlar. POJO herhangi bir sınıfı extend, interface’i implement (Serializable hariç) etmeyen ve ön tanımlı annotation’ları barındırmayan Java sınıflarıdır ancak JPA, bir nesnenin ORM ilişkisini XML ve annotation’lar ile tanımlar. Bu terimler Java sınıflarının bir ilişkisel-veritabanı ile nasıl eşleşeceğini (mapping) ifade eden yöntemlerdir. Bu nedenler POJO’nun son maddesini biraz esnetebiliriz sanırım.

Ayrıca JPA, veritabanında nesne sorgusu yapılabilmesini sağlayan nesne-düzeyinde sorgu dili olan JPQL’i tanımlar.

JPA Diagram

Tüm bu yazdıklarım kafanızı karıştırmasın JPA bunca şeyi kendi başına yapmıyor o sadece bir dizi arabirimdir ürün değil ve impelemte edilmesi gerekir. Asıl işi yapan ve yazılımcıların kod yükünü hafifleten “JPA Provider” framework’dür. Persistence kavramı yazılım dünyasında ilgi ile karşılanmıştır ve sonuç olarak ortaya birçok ORM aracı çıkmış bunlar: Hibernate, EclipseLink, TopLink vb. şeklindedir. Persistence ile ilgili bu kadar kütüphane çıktıktan sonra ortada bir karmaşa oluştu ve Java dünyası bu kütüphanelerin kullanışlı yanlarını toplayarak JPA standardını belirlemiş. Yani var olan tüm persistence araçlarının standart bir arayüzüdür.

ORM araçları ile alakalı en temel problem hepsinin farklı bir yaklaşıma dolayısıyla da bir API’ye sahip olmalarıydı. Bu yüzden bu çözümler birbirlerinin yerine geçebilir durumda değillerdi. Sun firması JPA’yı (2006) duyurduktan sonra Hibernate, Eclipselink, TopLink gibi bağımsız ORM araç üreticileri, JPA uyumlu ürünlerini piyasaya sürdü. Dolayısıyla bu gibi ürünlerle hem JPA hem de kendi özel (native) API’leri üzerinden programlama yapılabilmektedir.

JPA, hem Java SE hem de Java EE ortamlarında kullanılabilmektedir.

EJB (Enterprise JavaBeans) - Entity Beans

EJB 3.0 spesifikasyonu (2006)(Java EE 5 platformunun bir parçasıdır.) Java Persistence API tanımını içerir. Bununla birlikte, son kullanıcıların JPA kullanan uygulamaları çalıştırmak için EJB container veya Java EE uygulama sunucusunu kullanmasına gerek kalmadı. İlerleyen sürümlerde EJB/JSR(Java Specification Requests) spesifikasyonundan ayrılarak ayrı bir spesifikasyon olarak tanımlandı.

JSR, JCP’ye (Java Community Process) bağlı kurum ve topluluklar (Oracle, Sun Microsystems, Nokia vb.) tarafından Java platformu için önerilen isteklerin (şartname) bütününe verilen addır.

JPA, daha önce de bahsettiğim gibi EJB 2.0 CMP (Container Managed Persistence) yerine geçen ve son sürüm olan bir Java süreklilik (persistence) çözümüdür. EJB’nin, Eclipse Foundation tarafından Aralık 2019'da resmi adı Java ticaret markasının kullanılmaması için Jakarta Enterprise Beans olarak değiştirildi. Sun firmasının persistence spesifikasyon macerası OMG ile başlamış ancak pek başarılı olamamıştır. Ardından EJB 1.0 CMP Entity Beans’i piyasaya sürmüşler, başlangıçta IBM gibi Java EE destekçisi firmalar tarafından ilgi ile karşılanmış ancak Sun, Entity Bean’lerin oldukça karmaşık ve performans bakımından zayıf olduğunu düşünen belli bir kullanıcı topluluğunun tepkisi ile karşı karşıyaydı ve bu durumu düzeltmek için sonradan EJB 2.0 CMP ile Entity Bean’lerin karmaşıklığını yerel (local) interface’ler ile düzeltmeye çalışsa da yeterli bir başarı elde edememiştir.

Aşağıdaki ilgili bağlantıdan EJB’nin gelişimini inceleyebilirsiniz, ben sadece kronolojik sıralamasının olduğu kısımdan yararlandım:

Tabii ki burada EJB hakkındaki ifadeleri, kullandığım kaynaklara dayanarak yazıyorum. Kendi deneyimlerim değil ancak belirli bir topluluğun deneyimlerini yansıtıyor. Ben sektörü takip etme taraftarıyım, hangi teknoloji daha performanslı, güvenli ve kullanımı kolay ise onu kullanmanın faydalı olacağını düşünüyorum. Geride kalmış, artık projelerde kullanılmayanları öğrenmeye çalışmanın vakit kaybı olduğuna inanıyorum fakat benim zamandan yana bir sıkıntım yok diyen meraklısını da tutan yok :) Zaten yukarıda bahsettiğim kıstaslarda yeni çıkan bir teknoloji, rakibinden daha iyi ise projelerde bu teknoloji rağbet görür. Bunları takip etmek ve ilerisini görebilmek önemlidir.

Pamukkale University, CENG | Java

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store