1.1 Sınıfları tablolara eşleme

JDBC'yi öğrendikten sonra, büyük olasılıkla bir Java uygulamasındaki bir veritabanıyla çalışmanın hala bir zevk olduğu izlenimine sahipsiniz. Ya size tüm bu işlerin 10 kat daha kolay yapılabileceğini söylesem?

SQL dilinin ana avantajı nedir? Bu bildirimsel bir dildir - ne elde etmek istediğimizi açıklar ve bunun nasıl yapılacağı hakkında hiçbir şey söylemez. Nasıl - bu, SQL sunucusunun endişesidir.

Veritabanlarıyla çalışırken aynı yaklaşım kullanılabilir.

İdeal bir dünyada, veritabanına basitçe SQL sorguları yazabilir ve yanıt olarak, birkaç parça talep edersek hazır Java nesneleri veya Java nesneleri koleksiyonları alırdık.

Ne diyebilirim ki, 2000 yılında birkaç kişi böyle düşündü ve kendi ORM çerçevelerini yazmaya karar verdi.

ORM, Nesne-İlişkisel Eşleme anlamına gelir ve temel olarak Java nesnelerinin SQL sorgularıyla eşleştirilmesidir.

Adamlar çok basit bir şey buldular - veritabanındaki her tablo Java uygulamasındaki bir sınıfa karşılık gelmelidir . Bir Java uygulamasında nesnelerle çalışırız ve bu nesneler zaten kendilerini veri tabanına nasıl kaydedeceklerini bilirler.

Bu sorunu çözmek için üç yaklaşım vardı ve bunlar şuna benziyordu:

  1. Nesne kendisini veri tabanına kaydeder ve veri tabanından gelen bilgilere göre alanlarını günceller.
  2. Nesne kendini veritabanına kaydedebilir, ancak bu durumu asla başlatmaz.
  3. Nesne yalnızca veri içerir ve birisi onu veritabanına kaydeder ve veritabanından yükler.

Başlangıçta ilk yaklaşım hakim oldu, ardından Uygulama sunucuları ve Enterprise Java Fasulyeleri popülerdi. Persistence EJB'ler adı verilen ve kendilerini veri tabanına kendileri kaydedebilen bütün bir fasulye sınıfı bile vardı.

Ama bir gün her şey değişti...

1.2 Hazırda Bekletmenin Ortaya Çıkışı

2001 yılında, Hibernate çerçevesinin ilk versiyonu yayınlandı. Çok basit bir çerçeveydi, ancak veritabanında nasıl saklanması veya oradan nasıl yüklenmesi gerektiği hakkında hiçbir şey bilmeyen sıradan "aptal nesnelerin" kullanımına izin verdi.

Veritabanındaki bir tablodaki Java sınıflarının ve sütunlarının alanlarının eşlenmesi, bir XML dosyası kullanılarak ayarlandı. Ve bazen oldukça hantaldılar. Tamam, kimi kandırıyorum? Bunlar, XML kodunun ağır tuvalleriydi. Ve durum, yalnızca 20 yıl önce şimdiki kadar devasa veritabanlarının olmaması gerçeğiyle kurtarıldı.

Ama aslında, en güçlü karar, veritabanına kaydedilmesi gereken nesneyi, onu orada kaydeden koddan nihayet ayırmaktı . Bu çözüm gerçekten açık değil. Çünkü kapsülleme ilkesi, nesnenin nasıl kaydedilmesi ve yüklenmesi gerektiğini en iyi bildiğini belirtir.

Ve ORM yaklaşımı bu konsepti gerçekten bozuyor. Data sınıfı, kendi iç yapısını açığa çıkarır, ancak farklı türdeki nesne gruplarıyla çalışmak çok daha kolay hale gelmiştir.

Java 5'in piyasaya sürülmesinden sonra JDK'da iki şey göründüğünde büyük bir atılım geldi:

  • Açıklamalar
  • vekil

AçıklamalarXML hızla yerini aldı ve artık bir Java sınıfını doğrudan Java sınıfında veritabanındaki bir tabloya eşlemek için gerekli tüm ayarları belirtmek kolaydı.

vekilHazırda Beklet kullanıcısı için o kadar fark edilmez, ancak katkıları daha da ciddiydi. Hibernate'den belirli bir nesne veya nesneler talep ettiğinizde, size yalnızca bir saplama (proxy) döndürür ve yöntemlerine yapılan tüm çağrıları durdurur.

Bu, çeşitli Lazy Loading mekanizmalarının uygulanmasını mümkün kıldı ve Hibernate'in hızını ve verimliliğini o zaman için tamamen çok yüksek bir seviyeye çıkardı. Hazırda bekletme yalnızca fiili bir endüstri standardı haline gelmedi - diğer dillere çevrilmeye başlandı. Örneğin, C# için Framework NHibernate ortaya çıktı.

1.3 JPA'nın Ortaya Çıkışı

De facto ve ardından de jure tanıma. JDK geliştiricileri, nesnelerin bir veritabanındaki tablolarla nasıl düzgün bir şekilde eşleneceğine dair bir belirtim oluşturmaya karar verdiler. Bu belirtim denirJPA- Java Kalıcılık API'sı.

Bu tam olarak şartnamedir. Nesnelerin veritabanına kaydedilmesini istiyorsak, her şeyin nasıl çalışması gerektiğini ve sınıfın farklı bölümlerini işaretlemek için hangi ek açıklamalara ihtiyacımız olduğunu açıklar.

Görünüşe göre adamlar Hibernate'i temel almış ve paket adlarını ondan değiştirmişler. Çünkü Hazırda Bekletme modundaki tüm ek açıklamalar neredeyse birer birer JPA'ya taşındı.

Bugün Hibernate, tüm JPA spesifikasyonunun yanı sıra onunla çalışmayı daha da rahat hale getiren bazı ek özellikleri tam olarak uyguluyor. Bu nedenle, standardizasyon açısından Hibernate'in iki özellik grubuna sahip olduğunu söyleyebiliriz:

  • JPA standardı
  • Yerel API'yi Hazırda Beklet (ek işlevsellik)

Resmi Hazırda Bekletme belgeleri bunu şu şekilde açıklar:

Ancak hem deneyimlerime dayanarak hem de Hibernate belgelerini yeniden okuduktan sonra JPA ve Hibernate API'sinin %95 oranında aynı olduğunu söyleyebilirim. Onlar sadece özdeş kavramlardır.

1.4 Hazırda Bekletme için Maven

Hibernate'i bu kadar çok övdüğüme göre, sanırım onunla biraz daha sıkı çalışmanın zamanı geldi.

İlk olarak, sadece bir dizi İngilizce belgenin bulunduğu resmi bir site var. Elbette, eğitimde değil, referans bilgisinde bir önyargısı var. Ama yine de kaynaklarda hata ayıklamaktan daha iyidir, değil mi? :)

Talimat:

  1. Bağlantıyı açıyorsun .
  2. Ona uzun uzun bakarsın.
  3. CodeGym'a geri dönüyoruz.
  4. Diğer derslerimi okudunuz.

Benim işim karmaşık şeyleri basitleştirmek ve basit terimlerle açıklamak. Ve eğer bu seviyeye ulaştıysan, o zaman yapabilirim.

Hibernate'i kullanmaya başlamak için onu pom.xml dosyanıza eklemeniz gerekir. Bugüne kadar, Hibernate'in 6. sürümü veya daha doğrusu 6.1.1 zaten mevcut, bu nedenle en son sürümle nasıl çalışacağımızı öğreneceğiz.

Sadece şu satırları pom.xml'inize ekleyin:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Bu dersi 2023+ penceresinin dışında okuyorsanız, yeni sürüm buradan indirilebilir .

Önemli! Hibernate'in kullandığı kitaplıklardan bazıları JDK 11 ve JDK 17'de kullanımdan kaldırılmıştır, bu nedenle projenizi çalışır duruma getirmekte sorun yaşıyorsanız projeye şu bağımlılıkları ekleyin:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>