26 Ağustos 2022 Cuma

JPA IDENTITY identifier GeneratorType - Veri tabanına Özeldir

Giriş
Açıklaması şöyle. Bu seçenekte dikkatli olmak lazım, çünkü yavaş kalabilir. Bu konuyla ilgili bir yazı burada.
The IDENTITY option simply allows the database to generate a unique primary key for your application. No sequence or table is used to maintain the primary key information, but instead, the database will just pick an appropriate, unique number for Hibernate to assign to the primary key of the entity. With MySQL, the first lowest numbered primary key available in the table in question is chosen, although this behavior may differ from database to database.
Hibernate
Açıklaması şöyle. Yani IDENTITY eğer Hibernate ile batch insert yapılıyorsa iyi değil.
The problem with the IDENTITY entity identifier strategy is that it prevents Hibernate from batching INSERT statements at flush time. 
...

Kullanım
Örnek
MySql'de identity şöyle kullanılır. id sütununun auto_increment olarak yaratılması gerekir.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
Örnek
PosgreSQL'de sütunun "Serial" olarak yaratılması gerekir. Şöyle yaparız.
CREATE TABLE employee
(
  id serial NOT NULL,
  firstname CHARACTER VARYING(20),
lastname CHARACTER VARYING(20),
birth_date DATE, cell_phone CHARACTER VARYING(15), CONSTRAINT employee_pkey PRIMARY KEY(id) )
Örnek
Elimizde şöyle bir kod olsun
@Entity
@Table(name = "entity")
data class Entity(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,
    val metadata: String,
) : TenantEntity()
PosgreSQL'de sütunu "IDENTITY" olarak ta yaratabiliriz. Şöyle yaparız. Bu durumda aslında bizim için tablo başına bir sequence oluşturuyor
CREATE TABLE IF NOT EXISTS entity
(
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  ...
)
Sequnce'ı görmek için şöyle yaparız
SELECT * FROM pg_sequence WHERE seqrelid = 'entity_id_seq'::regclass;
Sequence'a geçmek için şöyle yaparız
private const val TABLE = "entity"
private const val SEQUENCE = "${TABLE}_id_seq"

@Entity
@Table(name = TABLE)
data class Entity(
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
    @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 50)
    @Column(name = "id")
    val id: Long? = null,
		val metadata: String,
) : TenantEntity()

Hiç yorum yok:

Yorum Gönder