Örnek JPA Uygulaması

Şimdi JPA kullanarak veri tabanına basit bir insert işlemi gerçekleştiren uygulama yazalım. Bu uygulamayı MyEclipse ortamında Derby veri tabanı kullanarak yazacağız. Siz kendi kullandığınız bir IDE’de farklı bir veri tabanı kullanarak da yapabilirsiniz. JPA’ya direk destek vermesi ve içerisinde örnek tabloların olması sebebiyle ben MyEclipse kullanacağım.

Önce Package Explorer penceresinde New -> Java Project diyerek bir proje yaratıyoruz.

Daha sonra projemize Sun standartlarına bağlı kalarak bir isim veriyoruz, diğer ayarları olduğu gibi bırakarak Finish butonuna tıklıyoruz. Ben isim olarak JPAOrnek verdim.

Projemiz sınıflarımızın bulunacağı src ismindeki bir dizin ve Java’nın standart kütüphaneleri ile yaratıldı. Şimdi projemizde JPA kullanacağımızı belirteceğiz. Bunun için proje üzerinde sağ klik, MyEclipse menüsünden Add JPA Capabilities…  seçeneğine tıklıyoruz.

Açılan sayfada bize JPA’nın implementasyonları olan teknolojilerden hangisini kullanmak istediğimizi soruyor. Biz bu uygulama için OpenJPA seçelim ve Next diyelim. Bütün teknolojilerin kullanımı birbirine çok benzer. Siz isterseniz Hibernate ya da Toplink teknolojilerinden birini de seçebilirsiniz.

Açılan sayfada bağlanılacak olan veri tabanı hakkında driver bilgisi ile schema bilgisini gireceğiz. Ben MyEclipse içerisinde hazır gelen Derby’yi kullanacağım için onun driver’ını seçiyorum. SQL Server, Oracle ya da başka bir veri tabanına bağlanmak istiyorsanız yan taraftaki Create new driver linkinden yeni bir driver tanımlayabilirsiniz.

Bu sayfada ayrıca Persistence unit name bilgisini girmemiz gerekiyor. Standart olarak proje ismimin sonuna PU eklenmiş ama istersek değiştirebiliriz. Bu isim daha sonra Entity Manager yaratırken kullanılacağı için önemlidir.

Driver bilgisinin hemen altında Copy DB driver jar(s) ile başlayan bir seçenek var. Bunu işaretlediğimiz taktirde projemizin veri tabanına bağlanabilmek için ihtiyaç duyduğu client driver otomatik olarak projeye eklenecektir.

Finish butonun tıkladığımızda OpenJPA kütüphaneleri, clientDriver.jar projeye eklenmiş ve META-INF adlı özel dizin içerisinde persistence.xml adında bir dosya oluşturulmuştur.

Bu dosya içerisinde projenin bağlanağı veri tabanı hakkında driver, connection-url gibi bilgiler yer almaktadır. Daha sonra veri tabanına karşılık gelen entity sınıflarımızı da yine bu dosya içerisine tanımlayacağız. Entity sınıflarımızı elle yazabildiğimiz gibi otomatik olarak yaratmak da mümkündür. Bunun için MyEclipse Database Explorer perspektifine geçerek, entity sınıfını yaratacağımız tablonun üzerinde sağ klik JPA Reverse Engineering… seçeneğine tıklıyoruz.

Açılan pencerede entity sınıfımızı nereye yaratmak istediğimizi belirtiyoruz. Ben daha önceden yaratmış olduğum entity paketi altına yaratılsın diyorum. Yaratılırken de persistence.xml dosyası güncellensin seçeneğini işaretliyorum. Bu sayede persistence.xml dosyasına entity sınıfımız otomatik olarak tanımlanmış oluyor.

Finish dediğimizde entity paketi altında seçtiğimiz tablo ile aynı isimde bir sınıf yaratılarak bu sınıfın referansı persistence.xml dosyasına yazılmış oluyor.

Örnek olarak kullandığımız Customer tablosunun tüm kolonları için Customer sınıfında birer değişken yaratıldı.

[codesyntax lang=”java” lines=”no”]

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Customer entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "CUSTOMER", schema = "CLASSICCARS")
public class Customer implements java.io.Serializable {

    // Fields

    private static final long serialVersionUID = -4279273036023102468L;
    private Integer customernumber;
    private String customername;
    private String contactlastname;
    private String contactfirstname;
    private String phone;
    private String addressline1;
    private String addressline2;
    private String city;
    private String state;
    private String postalcode;
    private String country;
    private Integer salesrepemployeenumber;
    private Double creditlimit;

    // Constructors

    /** default constructor */
    public Customer() {
    }

    /** minimal constructor */
    public Customer(Integer customernumber) {
        this.customernumber = customernumber;
    }

    /** full constructor */
    public Customer(Integer customernumber, String customername,
            String contactlastname, String contactfirstname, String phone,
            String addressline1, String addressline2, String city,
            String state, String postalcode, String country,
            Integer salesrepemployeenumber, Double creditlimit) {
        this.customernumber = customernumber;
        this.customername = customername;
        this.contactlastname = contactlastname;
        this.contactfirstname = contactfirstname;
        this.phone = phone;
        this.addressline1 = addressline1;
        this.addressline2 = addressline2;
        this.city = city;
        this.state = state;
        this.postalcode = postalcode;
        this.country = country;
        this.salesrepemployeenumber = salesrepemployeenumber;
        this.creditlimit = creditlimit;
    }

    // Property accessors
    @Id
    @Column(name = "CUSTOMERNUMBER", unique = true, nullable = false)
    public Integer getCustomernumber() {
        return this.customernumber;
    }

    public void setCustomernumber(Integer customernumber) {
        this.customernumber = customernumber;
    }

    @Column(name = "CUSTOMERNAME", length = 50)
    public String getCustomername() {
        return this.customername;
    }

    public void setCustomername(String customername) {
        this.customername = customername;
    }

    @Column(name = "CONTACTLASTNAME", length = 50)
    public String getContactlastname() {
        return this.contactlastname;
    }

    public void setContactlastname(String contactlastname) {
        this.contactlastname = contactlastname;
    }

    @Column(name = "CONTACTFIRSTNAME", length = 50)
    public String getContactfirstname() {
        return this.contactfirstname;
    }

    public void setContactfirstname(String contactfirstname) {
        this.contactfirstname = contactfirstname;
    }

    @Column(name = "PHONE", length = 50)
    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Column(name = "ADDRESSLINE1", length = 50)
    public String getAddressline1() {
        return this.addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }

    @Column(name = "ADDRESSLINE2", length = 50)
    public String getAddressline2() {
        return this.addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }

    @Column(name = "CITY", length = 50)
    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Column(name = "STATE", length = 50)
    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Column(name = "POSTALCODE", length = 15)
    public String getPostalcode() {
        return this.postalcode;
    }

    public void setPostalcode(String postalcode) {
        this.postalcode = postalcode;
    }

    @Column(name = "COUNTRY", length = 50)
    public String getCountry() {
        return this.country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Column(name = "SALESREPEMPLOYEENUMBER")
    public Integer getSalesrepemployeenumber() {
        return this.salesrepemployeenumber;
    }

    public void setSalesrepemployeenumber(Integer salesrepemployeenumber) {
        this.salesrepemployeenumber = salesrepemployeenumber;
    }

    @Column(name = "CREDITLIMIT", precision = 52, scale = 0)
    public Double getCreditlimit() {
        return this.creditlimit;
    }

    public void setCreditlimit(Double creditlimit) {
        this.creditlimit = creditlimit;
    }
}

[/codesyntax]

Son olarak da veri tabanına insert işlemini yapacak olan bir test sınıfı yazalım.

[codesyntax lang="java" lines="no"]
package test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import entity.Customer;

public class Test {

    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("JPAOrnekPU");
        EntityManager em = entityManagerFactory.createEntityManager();
        EntityTransaction userTransaction = em.getTransaction();

        userTransaction.begin();
        Customer customer = new Customer();
        customer.setAddressline1("Yenimahalle");
        customer.setAddressline2("Çayyolu");
        customer.setCity("Ankara");
        customer.setContactfirstname("Tuba");
        customer.setContactlastname("Pehlivan");
        customer.setCountry("Türkiye");
        customer.setCreditlimit(9700.00);
        customer.setCustomername("Erkin");
        customer.setCustomernumber(111111);
        customer.setPhone("312899423");
        customer.setPostalcode("06810");
        customer.setSalesrepemployeenumber(12);
        customer.setState("İç Anadolu");
        em.persist(customer);
        userTransaction.commit();
        em.close();
        entityManagerFactory.close();
    }
}
[/codesyntax]

EntityManagerFactory yaratırken kullandığımız createEntityManagerFactory() metoduna parametre olarak persistence.xml dosyasında tanımladığımız persistence unit name değerini veriyoruz. Daha sonra factory üzerinden EntityManager instance’ı oluşturarak transaction alıyoruz. Transaction’ı başlatıp entity sınıfımızın değişkenlerini set ediyoruz. Farkettiğiniz gibi Customer tablosu ile hiç uğraşmadık. Sadece entity sınıfımızın değişkenlerini set ettik. Arka tarafta JPA, JDBC alt yapısını kullanarak veri tabanına bağlandı ve yeni kayıt ekledi.

Veri tabanını kontrol edersek yeni kaydın Customer tablosuna eklendiğini görürüz.