Merhaba arkadaşlar. Bu yazı ile birlikte artık JPA/Eclipselink derslerine başlıyoruz ve JPA’ya giriş yapıyoruz.

İlk olarak ORM ve JPA konularının ne olduğu ile başlayalım.

ORM Ve JPA Nedir?

Açılımı Object Relational Mapping-İlişkisel Nesne Eşleştirme olan ORM bizim ilişkisel veri tabanımız ile projemiz arasında köprü görevi gören araçtır. Bu araç ile biz veri tabanımızdaki tabloları sınıflar ile sütunları da nesneler ile ilişkilendirerek ve nesneler üstünde çalışarak işlemlerimizi yaparız. Programcıya tamamen nesne modeli üzerinde çalışma imkanı sağlar. Ayrıca ORM projenizi veri tabanı türünden bağımsız kılan bir teknolojidir. Yani siz isterseniz MySql isterseniz MS SQL Server kullanın bu ORM için bir önem arz etmez. Diğer yandan ORM ile veri tabanı ve uygulamada kullanılan dil arasındaki tür uyuşmazlığı sorunu da ortadan kaldırılır. Diğer bir özellik de şudur. Normal projelerde bizler standart SQL ifadeleri ile veri tabanına kayıt yollar,çeker,siler,değiştiririz. ORM teknolojisi ile bu SQL ifadeleri kullanmak yerine daha basitleştirilmiş,daha hızlı ve daha güvenli işlemler yaparız. Bu olay JPA standartı çıkmadan önce çıkmış olan ORM çatılarında da vardı. JPA bunları örnek alarak geliştirildi.

JPA ise yukarıdaki özelliklerin tümünü taşıyan standartlaştırılmış ORM apisidir. Açılımı Java Persistence API‘dir. JPA ile bizler veritabanındaki tablolarımızı programımızdaki Java sınıfları ile, tablolardaki sütunlar da bu sınıflar içindeki değişkenler ile eşleştireceğiz. Daha sonra da tüm işlemlerimizi bu sınıf vasıtası ile yapacağız. Yani bizler JPA ile nesneler üzerinde çalışacağız.

JPA hem Java SE hem de Java EE için kullanılabilir bir teknolojidir. Ben JPA’yı buradaki yazılarda herkes tarafından anlaşılabilmesi için Java SE üzerinden anlatacağım.

Entity Konusu

Yazımızın bu kısmından sonra JPA’nın en temel konusu olan Entity Tanımlaması‘nı ve hangi şartların gerekli olduğunu öğreneceğiz.

En temel hali ile veri tabanımızdaki tablolarımıza karşılık gelen Java sınıflarımız bizim Entity sınıflarımız oluyor. Tablolarımızdaki sütunlar da bu Entity sınıfları içindeki değişkenler ile ifade ediliyor. Bir sınıfın Entity sınıfı olması için olmazsa olmaz 3 kural vardır arkadaşlar. Bunlar:

  • @Entity notasyonunun kullanılmış olması
  • Argüman almayan bir public yapılandırıcı(constructor) metodun var olması
  • @Id notasyonu kullanarak belirlenmiş bir ayırt edici alanın olmadır.

Ne demek istediğime şimdi bir de örnek kod ile bakalım arkadaşlar.

package jpa.pkg01;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class EntitySinifi implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String isim;
    
    public EntitySinifi()
    {
        
    }
    
    public EntitySinifi(Long id)
    {
        this.id=id;
    }

    public String getIsim() {
        return isim;
    }

    public void setIsim(String isim) {
        this.isim = isim;
    }  
}

Kodda gördüğünüz gibi Entity sınıfımız @Entity notasyonuna sahip,argümansız bir yapılandırıcısı var ve ayırt edici alan olarak @Id notasyonuna sahip. id değişkenimiz bu sınıf içinde Long olarak yazılı fakat istersek onu int ya da String olarak da tanımlayabiliriz. Ayrıca dikkat ederseniz id değişkeni için get/set metotları da yer almamakta sınıf içinde. @Id ile tanımlanmış alanın değiştirilmez olduğu düşünüldüğü için değişkene ait get/set metotları sınıfımızda yer almıyor.

Şimdi Entity sınıfımıza ekleyebileceğimiz bazı diğer özelliklerden olan @Table ve @Column notasyonlarına bakalım.

package jpa.pkg01;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Column;

@Entity
@Table(name="BASVURULAR")
public class EntitySinifi implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name="AdSoyad",length=50,nullable = false)
    private String isim;
    
    public EntitySinifi()
    {
        
    }
    
    public EntitySinifi(Long id)
    {
        this.id=id;
    }

    public String getIsim() {
        return isim;
    }

    public void setIsim(String isim) {
        this.isim = isim;
    }  
}

Kod içerisinde bir önceki koddan farklı olarak @Table ve @Column notasyonlarını kullandık. @Table notasyonu ile sınıfımız ve veri tabanımızdaki tablomuzun adının aynı olması durumunu ortadan kaldırabiliriz. @Table(name=”BASVURULAR”) ifadesi ile EntitySinifi sınıfının veri tabanında BASVURULAR tablosu ile ilişkilendirildiğini söylüyoruz. @Column notasyonu ile de sütunun ve değişkenin aynı isimde olması durumunu ortadan kaldırıyoruz ve sütuna boş değer gidip gidemeyeceği ile en fazla kaç karakter girilebileceğini belirleyebiliyoruz.

Son olarak Fiziksel Notasyon ve Mantıksal Notasyon kavramlarını ve farkını öğrenelim. Yukarıdaki kodda göreceğiniz üzere @Entity,@Table,@Id ve @Column notasyonlarını kullandık. @GeneratedValue notasyonu @Id notasyonu ile ilişkili olduğu için onu saymadık.

Fiziksel notasyonlar veri tabanı yapılandırmasını sınıfa haritalayan notasyonlardır. Yani Fiziksel notasyonlar ile tablo adı, sütun adı tanımalama ve daha başka ayarlar yapmak mümkündür. Mantıksal notasyonlar ise veri tabanı ve sınıf arasındaki modellemeyi sağlayan notasyonlardır. Yani sınıfın bir Entity sınıfı olarak davranmasını sağlayan notasyonlardır. Buradan hareketle @Entity ve @Id notasyonlarının Mantıksal Notasyon, @Table ve @Column notasyonlarının da Fizikesel Notasyon olduğunu söyleyebiliriz.

Gelecek yazıda görüşene kadar sağlıcakla kalın arkadaşlar.

Selam ve Sevgilerimle