Hibernate - @GenericGenerator

Posted by dogukanhan on June 05, 2020 · 2 mins read

JPA’de yer alan GeneratedValue strategy’lerinin yetersiz kaldığı ve hibernate’e ait generatorleri kullanmak istediğimizde bu Annotation’ı kullanırız. Strategy ve name olarak iki farklı parametre alabilir. Strategy için aşağıdakileri destekler.

  • native : Otomatik olarak seçim yapar, kullanılan veritabanı sistemi yapılacak seçimde göz onünde bulundurulur squence veya identity örnek olarak bu seçimlerden birisi olabilir.
  • squence: Veritabanında yer alan HIBERNATE_SEQUENCE isminde bir squence oluşturur ve bunu kullanılır. Squence her bir insert sorgusundan önce çağrılır. org.hibernate.id.SequenceGenerator sınıfı kullanılırak squence ismi ve bir kaç parametresi değiştirilebilir.
  • squence-identity: Veritabanı squence’si çağrılarak insertion yapılır. Üretilen anahtar değeri insert sorgusundan sonra çağrılır.
  • enhanced-sequence: Veritabanı squence destekliyorsa kullanır aksi taktirde bir tablo yaratır ve bunu squence gibi kullanır. Her bir insert sorgusundan önce Anahtar değer çağrılır. org.hibernate.id.enhanced.Optimizer’ı destekler bu sayede her seferinde veritabanına başvurmak yerine kendi yeni anahtar üretebilir. Varsayılan olarak anahtar için her seferinde veritabanına başvurur. JPA içerisindeki eşdeğeri GenerationType.SQUENCE ve GenerationType.AUTO’dur. Yer alan strategylerden en iyilerinden birisidir.
  • seqhilo: Hibernate6 ile desteği kalkmıştır
  • hilo: Hibernate6 ile desteği kalkmıştır
  • enhanced-table: Veritabanında bir tablo kullanarak yeni anahtarlar üretir. JPA’de eşdeğeri GenerationType.TABLE’dır.
  • identity: Autoincrement desteği olan veritabanları için kullanılır. Anahtar değeri veritabanı tarafından üretilir. JPA’ GenreationTpye.IDENTITY’in aynısıdır.
  • increment: Hibernate select sorugusu kullanarak her bir insert’ten önce maximum id’yi seçer ve bir fazlasını yeni kayıt için kullanır. Cluster olmayan bir uygulama için optimal olabilir fakat diğer senaryolarda kullanılmamalıdır.
  • select: Hibernate herhangi bir anahtar üretimi işlemi yapmaz veritabanı tarafından bunun yapılmasını beklenir schema veya trigger yardımıyla, insert sorgusundan sonra select sorgusu yaparak veritabanı tarafından üretilen yeni anahtar değerini alır.
  • uuid2: Hibernate uygulama katmanında benzersiz 128-bit UUID oluşturur. UUID değeri String değişkeninde, byte[16] veya java.util.UUID içerisinde saklanabilir. org.hibernate.UUIDGenerator kullanılarak özelleştirilebilir.
  • guid: Veritabanı tarafından sağlanan globally unique identifier kullanır. Her insert sorgusundan önce veritabanında bu işi yapacak fonksiyonu çağırır ve yeni insert kayıtında üretilen anahtarı kullanır.

Generation stratejisi olarak (pre-insert)insert sorgusundan önce anahtar üretenlerin kullanılması daha iyidir. enchanced-squence kullanmak çoğu durum için diğerlerine göre daha avantajlıdır çünkü veritabanı squenceleri hızlıdır ve eğer veritabanı squence desteklemiyorsa table oluştururak devam edebilir.

Aşağıda bir increment generator için örnek bir kullanım verilmiştir.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student {

    @Id
    @GeneratedValue(generator = "increment")
    @org.hibernate.annotations.GenericGenerator(name = "increment", strategy = "increment")
    private Long id;

    public Long getId() {
        return id;
    }
    
}