@GeneratedValue stratejilerini Oracle ile kullanmak

JPA-Hibernate, birincil anahtarlar (primaryKey)  için 4 adet değer üretme stratejisine sahiptir.

  • AUTO
  • IDENTITY
  • SEQUENCE
  • TABLE

 

Aslında 3 strateji var da denilebilir. Çünkü AUTO stratejisi diğer 3 stratejiden herhangi birini seçme hakkının Hibernate yada JPA’ya bırakılmasını sağlar. Örneğin veritabanı olarak Oracle kullanıyorsanız GenerationType’ı AUTO olarak tanımlamanız durumunda sistem varsayılan olarak TABLE stratejisini kullanacaktır. Bu durumda, veritabanında id değerlerini çekeceğiniz bir tablo bulunmak zorundadır.

@GeneratedValue anotasyonu birincil anahtar olarak kullanılacak değişkenin üzerinde yada onun Getter metodu üzerinde tanımlanmalıdır. Bu şekilde GenerationType’ı seçebilir ve istediğimiz stratejiyi belirleyebiliriz.

 

NOT: IDENTITY stratejisi, Oracle tarafından desteklenmemektedir!

 

Sequence stratejisinin kullanılması :

  • Sequence oluşturulması :

İlk olarak veri tabanında sequence oluşturulur.

[code lang=”sql”]
–Örnek Script
create sequence SEQ_GNRAKN
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1;
[/code]

SEQ_GNRAKN adında bir sequence oluşturuldu ve 1 den başlayarak, her tetiklendiğinde 1’er 1’er artacak şekilde ayarlandı.

  • Varlık(Entity) sınıfının oluşturulması :

@GeneratedValue anotasyonu içerisinde stratejiyi belirledikten sonra generator olarak hemen bir alt satırda oluşturduğumuz @SequenceGenerator’ı gösteriyoruz. Bu generator içerisinde de veri tabanında oluşturduğumuz Sequence’ın ismini vererek bağlantıyı sağlamış oluyoruz.

[code lang=”java”]
package com.gunerakin.strategy;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="TEST_TABLE")
public class SeqTest implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ")
@SequenceGenerator(name="SEQ", sequenceName="SEQ_GNRAKN", allocationSize=1)
private long id;

public SeqTest () {}

public long getId() {
return this.id;
}

public void setId(long id) {
this.id = id;
}
}
[/code]

 

Table stratejisinin kullanılması

  • Tablo oluşturulması :

İlk olarak Id değerlerini tutacağımız bir tablo oluşturmalıyız.

[code lang=”sql”]
–Örnek Script
create table TABLE_GENERATOR
(
gen_key VARCHAR2(255) not null,
gen_value NUMBER,
constraint pk_gen_key PRIMARY KEY (gen_key)
)
[/code]

Veritabanında yukarıdaki gibi key-value yapısında bir tablo oluşturulur. Key sütunu birincil anahtar olarak belirlenir ve tipi String olarak ayarlanır. Bunun sebebine az sonra değineceğiz.
Value kısmı ise id değerlerimizin tutulacağı sütundur ve tipi number olarak belirlenir. Tabloyu oluşturduktan sonra içerisine aşağıdaki gibi bir adet veri girişi yapılır.

[code lang=”sql”]insert into TABLE_GENERATOR (Gen_Key,GEN_VALUE) values (‘SCHEMA_NAME.TABLE_TEST’,0)[/code]

Olayın gidişatını daha iyi anlamak için önce varlık sınıfımızı oluşturalım.

  • Varlık(Entity) sınıfının oluşturulması :

[code lang=”java”]
package com.gunerakin.strategy;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name = "TABLE_TEST")
public class TableTest implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@TableGenerator(name="TABLE_GEN",table="TABLE_GENERATOR", pkColumnName = "GEN_KEY", pkColumnValue = "SCHEMA_NAME.TEST_TABLE", valueColumnName = "GEN_VALUE", initialValue = 1, allocationSize = 1 )
@GeneratedValue(strategy = GenerationType.TABLE, generator="TABLE_GEN")
private long id;

public TableTest () {
}

public long getId() {
return this.id;
}

public void setId(long id) {
this.id = id;
}
}

[/code]

 

@TableGenerator anotasyonu içerisinde kullanılan özelliklerin tanımları şöyle :

  1.  table = Id oluşturmak için kullanacağımız tablonun adı.
  2.  pkColumnName = Generate işlemi için oluşturduğumuz tablonun birincil anahtar adı.
  3.  pkColumnValue = Birincil Anahtar değeri
  4.  valueColumnName = Id değerinin tutulacağı sütunun adı.
  5.  initialValue = Id değerine ilk atanacak değer.
  6.  allocationSize  =  Her tetiklemede Id değerine eklenecek değer.
  7.  name = @GeneratedValue’da çağırmak için kullanacağımız isim.

Yukarıda görüldüğü üzere pkColumValue kısmında “SCHEMA_NAME.TEST_TABLE” şeklinde bir değer verdik. Bu değer genelikle okunabilirliği arttırmak açısından şema adı ve tablo adının nokta ile birleştirilmesiyle oluşturulur.

Tüm bu olayların Türkçe’si şudur ki : Kardeşim sen db ye git, pkColumValue parametresi üzerinden sana gönderdiğim değerle ilgili satırı bul ve bunun valueColumn olarak belirlediğim sütunundaki değerini, primary key olarak kullanmak için al. Daha sonra valueColumn değerini, belirlediğim allocationSize  kadar arttırıp güncelle. 😀

 

Özet olarak :

Eğer DB tarafında Oracle ile çalışıyorsanız, Sequence ve Table stratejilerini JPA-Hibernate varlık sınıflarınıza implement edebilirsiniz. Sequence stratejisi Oracle bağımlıdır ve veri tabanınızı değiştirmeniz durumunda çalışmayacaktır. Table stratejisi ise veri tabanı bağımlıdır. Sequence stratejisine göre biraz daha karışık gibi görünsede, Table stratejisi veri tabanı değişse bile aynı şekilde kullanılmaya devam edilebilir.

 

Yazar: gnrakn

"To make this journey, We’ll need imagination. But imagination alone is not enough. Because the reality of nature far more wondrous than anything we can imagine.”

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir