JPA (Java Persistence API)

ORM Nedir?

  • Object / Relational Mapping
  • Nesne dünyası <-> İlişkisel veritabanı dünyası 
  • Nesne ve Veritabanı Tabloları arası soyutlayıcı mekanizmayı sağlar

ORM tarihi 

  • İlk olarak 1995 yılında SmallTalk programlama dili için oluşturulan, Toplink ürünü 
  • JCP, JDO piyasaya sürüyor, fakat ihtiyaca karşılık veremiyor.
  • Sonrasında, açık kaynak kod dünyasının ürünü olan Hibernate meydana çıkıyor.
  • Hibernate çok başarılı oluyor, ve sektörü elinde bulunduruyor.
  • JCP, Hibernate’ in başarısından etkilenerek yeni bir standart oluşturma yarışına giriyor. 

ORM Tarihi

  • Bu yarışın sonunda JPA (Java Persistence API) şartnamesi ortaya çıkıyor.
  • JPA standardı oluşturulurken, Hibernate projesinden katkı sağlanıyor.
  • JPA standardına uyan birden fazla kütüphane var; EclipseLink, Hibernate, JDO, Topling vs.

JPA (JSR 338) 

  • JPA sadece bir standart. 
  • Referans uygulayıcı kütüphane : EclipseLink
  • Eclipse vakfının bünyesinde

JPA destekleyenler

  • DataNucleus (formerly JPOX)
  • EclipseLink (formerly Oracle TopLink)
  • JBoss Hibernate 
  • ObjectDB 
  • OpenJPA
  • Versant JPA (not relational, object database)

Entity kavramı

  • Veritabanına senkronize edilen her bir Java nesnesine Entity adı verilir. 
  • Entity nesneleri Entity Yönetici (EntityManager) tarafından yönetilirler.

Persistence Context

  • Entity Manager tarafından yönetilen Entity nesneleri, Persistence Context adı verilen alanda saklanırlar.

Entity Manager 

  • Entity nesnelerini yönetmekten sorumludur.
  • EntityManager gövdesiz yordamları bulunan bir arayüz (interface) ‘ dür.
  • EntityManagerJPA sağlayıcısı üzerinden elde edilir.

EclipseLink

Toplink

Hibernate

vs...

Entity Sınıflarda Uyulması Gereken Kurallar  

  • Bir Entity sınıfı oluşturmak için @Entity gereklidir.
  • Birincil anahtarı tanımlaması amacıyla @Id notasyonunu bulundurmalıdır.
  • Enum ya da Interface sınıflar Entity olarak tanımlanamazlar.
  • Ne bir Entity sınıfı ne de onun yordam ya da veri alanları “final” (sabit) türde olamazlar. 

@Entity 

  • Bir entity nesnesi, kalıcı hale getirildiğinde, kendisine adanan tabloda bir satır girdisini temsil eder.
@Documented
@Target(TYPE)
@Retention(RUNTIME)
public @interface Entity {
String name() default "";
}

@Id ve @GeneratedValue

  • @Id : Tanımlı alanı Birincil Anahtar olarak kabul eder. Birincil Anahtar alanları eşsiz (unique) olmalıdır.
  • @GeneratedValue : Birincil Anahtar alan değerlerinin belirli stratejilerle otomatik olarak üretilmesine olanak tanır.

Entity Alanları 

  • @Basic    
  • – double, byte[], Double, Integer, Person
  • @ElementCollection
  • – Collection, List, Set

@Column notasyonu

  • Tanımlı girdi alanında yapılandırma işlemlerine olanak tanır.
  • Sütun adı, Max. Uzunluk, Null değer alınabilirlik, Veri eklenebilirlik, Güncellenebilirlik gibi özellikler tanımlanabilir.

Transaction (Giriş) 

  • Transaction kısaca; “Ya Hep Ya Hiç” mantığıyla çalışan ve yapılan işlemlerin başarılı olup olmadığı bilgisini veren ve bu bilgiyi garanti eden mekanizmadır
  • JPA işlemlerinde Transaction nesneleri, Entity Yönetici nesneler tarafından sağlanır.

Temel EntityManager Yordamları

public interface EntityManager {
. . .
public void persist(Object o);
public void remove(Object o);
public <T extends Object> T find(Class<T> type, Object key);
public <T extends Object> T merge(T t);
. . .
}

Entity nesnelerinin yaşam süreci 

  • Her Entity nesnesi = Normal Java nesnesi
  • Entity nesnesi ilk oluşturulduğunda, olağan Java nesnesi gibi davranır.
  • Entity nesnesindeki farklılık; EntityManager tarafından yönetimli oluşu ya da olmayışıdır

Sık kullanılan EntityManager Yordamları

public interface EntityManager {
. . .
public void persist(Object o);
public void remove(Object o);
public <T extends Object> T find(Class<T> type, Object key);
public void flush();
public void refresh(Object o);
public void clear();
public void detach(Object o);
public boolean contains(Object o);
public <T extends Object> T merge(T t);
. . .
}

Entity'ler Arası İlişkiler 

  • @OneToOne

– X has a Y 

  • @OneToMany

       – X has many Y

  • @ManyToOne

– Y has many X

  • @ManyToMany

– X has many Y and Y has many X

Katılım Tablosu ( @JoinTable )

Katılım Sütunu ( @JoinColumn )

Uygulama Tablosu Çıktısı

Soru?

Zincirleme Entity Operasyonları

JPA - Type Conversation

X -> Entity type
Y -> DB type
public interface AttributeConverter<X,Y> {
 public Y convertToDatabaseColumn (X attribute);
 public X convertToEntityAttribute (Y dbData);
}

Not: @Converter notasyonu ile deklare edilir.

JPA – Entity Graph

  • Birbiriyle ilişkilendirilmiş Entity bileşenlerinden Graph sorguları oluşturmayı sağlar.
  • Dynamic Weaving aktif olmalıdır.

JPQL Sorgulama Dili

  • JPQL (Java Persistence Query Language) , SQL diline benzer şekilde sorgulama yapmaya olanak tanır.
  • Dinamik ve İsimlendirilmiş sorgular JPQL diliyle oluşturulurlar.

JPQL Başlangıç Gösterimi

JPA ile sorguların işletilmesi

  • EntityManager nesnesinin çeşitli yordamlarıyla sorgular işletilebilir;

SELECT sorgusu : Örnek I

SELECT sorgusu : Örnek 2

SELECT COUNT(..)

SELECT MAX

WHERE ifadesi

Çoklu ifadelerin sorgusu

GROUP BY ifadesi

NEW ifadesi

NEW ve WHERE

JOIN ifadeleri

  • JOIN (Katılım) sorguları, Birden fazla ilişkili
    entity nesnesini birbirine katma (birleştirme)
    işlemini yürütürler.

JOIN veya INNER JOIN

INNER JOIN

  • Birbiriyle ilişkili iki Entity nesnesini birleştirir.

JPQL sorgularında parametre kullanımı

  • Geliştiriciler çalışma anında JPQL sorgularına
    parametre geçirmek isteyebilirler.
  • Geçirilen parametreler daha çok WHERE
    tümcesinde kullanılırlar.

JPQL sorgularında parametre kullanımı

  • JPQL sorgularında parametreler iki şekilde
    tanımlanabilirler;
  1. Numaralandırılmış parametreler
  2. İsimlendirilmiş parametreler.

İsimlendirilmiş parametre kullanımı

  • İsimlendirilmiş parametreler : işaretiyle
    başlarlar.

İsimlendirilmiş sorgular

  • Şu ana kadar Dinamik sorguları kullandık.
  • Dinamik JPQL sorguları çalışma anında
    (runtime), kullanılan veritabanına özgü SQL
    dilini öykünürler.
  • İsimlendirilmiş sorgular (NamedQueries) ise,
    derleme anında (compile time), SQL biçimine
    öykünürler.

İsimlendirilmiş sorgular

  • İsimlendirilmiş sorgular, Entity sınıflarının
    başına ; @NamedQueries notasyonuyla
    tanımlanırlar

İsimlendirilmiş sorgular

Sorular?

Made with Slides.com