JPA

JPA 04- Simple Composite Key

Merhaba arkadaşlar. Bu dersimizde Simple Composite Key konusunu öğreneceğiz.

Simple Key dediğimiz zaman anlamamız gereken şey Id özelliği için sadece bir alan kullanılmasıdır. Örneğin şöyle:

@Id
private int id;

Composite Key dediğimiz zaman birden fazla alanın Id olarak kullanılabilmesidir kastettiğimiz olay. Birden fazla alan Id olarak kullanılır ve bu Id alanları POJO diyebileceğimiz başka bir sınıfta da kullanılırsa o zaman Simple Composite Key kullanmış oluruz. Ne denilmek istendiğine örnek kodla bakalım:

Car.java

import javax.persistence.*;

@Entity
@IdClass(CarId.class)
public Class Car
{
      @Id 
      private int serial;
      
      @Id
      private String brand;

      private String name;

      public String getName()
      {
             return name;
       }

public int getSerial() {
        return serial;
    }

    public void setSerial(int serial) {
        this.serial = serial;
    }

    

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Car sınıfımızın üstünde gördüğünüz üzere bir IdClass notasyonumuz var. Bu notasyona parametre kısmına verdiğimiz sınıf bizim Entity sınıfımızın Id özelliklerini barındıran sınıfdır. Car entitiy sınıfımız Id olarak int serial ve String brand kullanıyor. CarId sınıfımız da bu özellikleri içinde barındıracak.

CarId.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package jpatest;

import java.io.Serializable;

/**
 *
 * @author ilkaygunel
 */
public class CarId implements Serializable{
    int serial;
    String brand;
    
    public CarId()
    {
        
    }

    public CarId(int serial, String brand) 
    {
        this.serial = serial;
        this.brand = brand;
    }

    public int getSerial() {
        return serial;
    }

    public void setSerial(int serial) {
        this.serial = serial;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
    
    @Override
    public int hashCode()
    {
        return serial+brand.hashCode();
    }
    
    @Override
    public boolean equals(Object obj)
    {
        if(obj instanceof CarId)
        {
            CarId carId= (CarId) obj;
           return carId.serial == this.serial && carId.brand.equals(this.brand);
        }
        return false;
    }
}

Bizim Id olarak kullanacağımız alanları içinde barındıran CarId sınıfnın bu Simple Composite Key özelliğini taşıyabilmesi için

  • Parametre almayan varsayılan yapılandırıcı olması lazım.
  • Serializable arabirimini uygulaması lazım.
  • hashCode ve equals metotlarını kendi içinde ezmiş ( override ) olması lazım.

CarId sınıfımız gördüğünüz üzere bizim Id olarak kullanacağımız alanları içinde barındırıyor ve bunlara ait get-set metotlarına sahip. Bunun yanında nesne oluşturuken sınıfın sahip olduğu id nesnelerinin de kullanılabilmesi için 2 parametreli bir yapılandırıcı var.

Peki Bu Ne İşimize Yarayacak?

Buraya kadar konuyu anladığınızı fakat aklınıza bu ne işe yarayacak diye soru geldiğini düşünüyorum. 🙂

Bu Simple Composite Key JPA’nın find metodunu kullanırken işimize yarayacak. Sıradan entitiy sınıflarında bir id alanı olur ve bir kaydı bulup getirmek için

em.find(Car.class,1);//1 burada ilgili kaydın id'si. Yanı 1 numaralı kayıt gelecek.

ifadesini kullanabiliriz. Ama bazı durumlarda iki ya da daha fazla id alanı kullanılmış olabilir. İşte bu durumda

CarId carId = new CarId(33, "Ford");
Car persistedCar = em.find(Car.class, carId);


kodu ile iki id alanımızı barındıran sınıftan bir nesne türetip onu id imiş gibi find metoduna verebiliriz. Böylece birden fazla id’si olan kayıtları rahatlıkla bulabiliriz.

Bu yazımızda da bu kadar arkadaşlar. Gelecek yazımızda Complex Composite Key konusunu işleyeceğiz. Sağlıcakla kalın.

Yorum Yap