Giriş
Açıklaması şöyle. Bu seçenekte dikkatli olmak lazım, çünkü yavaş kalabilir. Bu konuyla ilgili bir yazı burada.
MySql'de identity şöyle kullanılır. id sütununun auto_increment olarak yaratılması gerekir.
PosgreSQL'de sütunun "Serial" olarak yaratılması gerekir. Şöyle yaparız.
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....If you want to fix this issue, you have to execute the JDBC batch inserts with a different framework, like jOOQ.
Kullanım
ÖrnekMySql'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;
ÖrnekPosgreSQL'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şturuyorCREATE 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()