Hibernate - Entity @GeneratedValue

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

@GeneratedValue Annotation’ı @Id ile birlikte kullanılır ve değişkenin otomatik değer almasını sağlar. Aşağıdaki örnekte id değişkeni oluşturulmuş Student nesnesinin veritabanına kaydedilmesi sırasında otomatik bir değer alır.

@Entity
public class Student{

    @Id
    @GeneratedValue
    private Long id;

    public Long getId() {
        return id;
    }

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

Yukarıdaki sınıf için oluşturulan nesnenin kaydedilme kodu. @Id Annotation’ı kullanıldığında ilgili entity sınıfının değişkeni null olmamalıdır. Fakat @GeneratedValue kullandığımızda değer otomatik olarak atanacak ve null olmayacağından dolayı bu değişken null olarak bırakılabilir.

Student student = new Student();
session.save(student);

@GeneratedValue strategy

Otomatik değer oluşturulurken nasıl bir algoritmanın kullanılacağı bu değişken ile belirlenir. Herhangi bir değer belirlenmez ise varsayılan seçenek GenerationType.AUTO‘dur .Aşağıdaki seçenekleri mevcuttur.

  • GenerationType.AUTO
  • GenerationType.TABLE
  • GenerationType.SEQUENCE
  • GenerationType.IDENTITY,

GenerationType.AUTO

Hibernate tarafından otomatik olarak bir strategy seçilmesini sağlar.

@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
Varsayılan değer olduğundan dolayı aşağıdaki gibi bir değer atanmadan da kullanılabilir.
@Id
    @GeneratedValue
    private Long id;

GenerationType.TABLE

Veritabanı içerisinde bir tablo oluşturarak sıradaki değerin hesaplanmasını sağlar bu diğer yöntemlere göre daha yavaştır ve kullanımı seyrektir.

@Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

Yukarıdaki kod için oluşturulan hibenate_squences tablosu(postgresql için)

sequence_name next_val  
default 1 </figure>

GenerationType.SEQUENCE

Veritabanı sequence’lerini kullanarak otomatik değeri sağlar. Bu seçenek kullanıldığında veritabanı içerisinde bir sequence oluşturulur.

@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

Yukarıdaki kod için oluşturulan hibernate_sequence (postgresql için)

last_value log_cnt is_called  
1 32 true </figure>

GenerationType.IDENTITY

Veritabanı içindeki Auto Increment özelliği kullanılarak sıraki değerin üretilmesini veritabanına bırakır.

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;