Merhabalar arkadaşlar. Önceki yazımızda Identitiy ve Sequence ile Id genelleştirme konusunu öğrenmiştik. Bu yazımızda da Id genelleştirmenin diğer iki yöntemi olan TableGenerator ve Auto konularını öğreneceğiz.
TableGenerator
TableGenerator’da mantık şudur arkadaşlar.:
Veri tabanınızda sırf bu Id genelleştirme işlemi için Id bilgisini tutan bir tablo oluşturursunuz ve Id genelleştirme işlemlerini @TableGenerator notasyonu ve bu tablo vasıtası ile yaparsınız. Veritabanının taşınabilir olabilmesi için kullanılabilecek tek yöntemin bu olduğu söylenir arkadaşlar çünkü önceki yazıda da bahsettiğim üzere bir takım veritabanları Identitiy bir takım veritabanları Sequence destekler. Bir veri tabanını örneğin PostgreSQL’den MS SQL Server’a taşımak istediniz. Bu sırada eğer TableGenerator kullanmadı iseniz proje içinde bu veritabanı sorununu aşabilmek için farklı modüller oluşturmanız gerekecekti. Ama TableGenerator bizi bu sorundan kurtarıyor. Şimdi örnek kodumuza bakalım:
@Entity public class Kisi implements Serializable { private static final long serialVersionUID = 1L; @Id @TableGenerator(name = "TABLE GENERATOR",table = "IdTablosu",pkColumnName = "IdTabloAdi", pkColumnValue = "kisiId",valueColumnName = "IdDegeri",allocationSize = 1) @GeneratedValue(strategy = GenerationType.TABLE,generator = "TABLE GENERATOR") private Integer id; @Column(name = "name") private String name; public Kisi() { } public String getName() { return name; } public void setName(String name) { this.name = name; }
Başka bir tablo vasıtası ile Id genelleştirme işlemi yapmak istediğimizde @TableGenerator notasyonunu kullanıyoruz. Şimdi adım adım bu notasyonun özelliklerinine değinelim:
- name özelliğine @GeneratedValue notasyonunda generator kısmında da kullanacağımız ismini atıyoruz.
- table özelliğine hangi tabloyu Id genelleştirme için kullanacağımızı atıyoruz. Bu örnek için IdTablosu ismindeki tabloyu kullanıyoruz.
- pkColumnName özelliğine id’nin adını tutacak kolonu atıyoruz. Örneğin IdTablosu içindeki IdTabloAdi kolonu bizim id’mizin adını tutacak kolon. Bu kolon her bir tablo için id isimleri tutacak.
- pkColumnValue özelliğine üstte bahsettiğim id ismini atıyoruz. Bu örnekte veri tabanımızdaki Kisi tablosu’nun id özelliği için IdTablosu IdTabloAdi kolonunda kisiId adında bir satır tanımladım. Kisi tablosu için her gelen kayıtta kisiId satırı dikkate alınacak.
- valueColumnName özelliğine de id’nin kendisini tutan kolonu atıyoruz arkadaşlar. IdTablosu içinde IdDegeri kolonu bizim id’lerimi tutacak.
- allocationSize ile her gelen kayıtta id kaç kaç artsın diye belirtiyoruz. Bu örnekte bir bir artacağını belirtiyoruz. Eğer atama yapılmazsa JPA 50 arttırıyor.
@GeneratedValue notasyonuna da önceki derste değinmiştik. Burada bilmemiz gereken @TableGenerator notasyonunda verdiğimiz name özelliğini @GeneratedValue notasyonunun generator özelliğine atamamız gerektiğidir.
Veri tabanından bir ekran görüntüsü ile durumu görselleştirelim.

IdDegeri sütunu Kisi tablosuna yeni kayıt geldiğinde 103 olup 103 değerini Kisi tablosunun id sütununa yollayacak.
Auto
Auto ile Id genelleştime işlemini JPA’ya bırakıyoruz ve öğrendiğimiz 3 notasyondan birini JPA otomatik olarak seçiyor arkadaşlar. Hiçbir Id genelleştirme yöntemi tanımlamasak AUTO modu atanıyor Id genelleştirmeye. Öğrendiğim kadarı ile bu atama işlemi yapılırken veritabanınızın ne olduğu incelenip ona en uygun atama yapılıyor. Tek yapmamız gereken şu:
@GeneratedValue(strategy = GenerationType.AUTO) // ya da sadece @GeneratedValue
Bu dersimizde de bu kadar arkadaşlar. Gelecek dersimizde Simple Composite Key konusunuz işleyeceğiz. Sağlıcakla kalın.