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;
- Numaralandırılmış parametreler
- İ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?
JPA (Java Persistence API)
By Talip Akhan
JPA (Java Persistence API)
JPA(Java Presistance API) Başlagıç
- 232