Anotace javax.persistence.SequenceGenerator

Anotace @SequenceGenerator se používá k určení generátoru primárních klíčů pro tabulku. Na tento generátor je odkazováno z anotace @GeneratedValue.

name – Název generátoru, který musí být unikátní.
sequenceName – Název sekvence v databázi. Je to sekvence, která již v databázi existuje.
allocationSize – Musí být stejná jako hodnota „auto incerement“ sekvence v databázi.

import cz.vitfo.entity.CustomerEntity.Companion.GENERATOR_NAME
import cz.vitfo.entity.CustomerEntity.Companion.SEQUENCE_NAME
import cz.vitfo.entity.CustomerEntity.Companion.TABLE_NAME
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.SequenceGenerator
import javax.persistence.Table

@Entity
@Table(name = TABLE_NAME)
@SequenceGenerator(name = GENERATOR_NAME, sequenceName = SEQUENCE_NAME, allocationSize = 1)
class CustomerEntity(

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = GENERATOR_NAME)
    var id: Long

) {
    companion object {
        const val TABLE_NAME = "t_customer"
        const val SEQUENCE_NAME = "${TABLE_NAME}_id_seq"
        const val GENERATOR_NAME = "${SEQUENCE_NAME}_gen"
    }
}

Anotace @Version v JPA

Sloupec s touto anotací bude navýšen (jeho hodnota) v případě update entity. Pokud hodnoty zůstávají stejné, po update se verze nezvyšuje. Pokud načteme entitu v jednom vlákně a v jiném vlákně ji updatujeme, tak poté v tom prvním vlákně při ukládání dostaneme

Exception in thread "main" javax.persistence.OptimisticLockException: 
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

Číst dálAnotace @Version v JPA

Nastavení sloupce v JPA tak, aby jej nešlo updatovat

Anotace @Column umožňuje nastavit sloupec jako neupdatovatelný pomocí updatable = false. V následujícím příkladu je takto nastaven sloupec title.

@Column(unique = true, updatable = false)
var title: String = "",

V kódu je sice možné nastavit novou hodnotu

book.title = "New title"
book.description = "New description"

sloupec se ale neobjeví ve vygenerovaném sql.

update
    t_book 
set
    description=?
where
    id=?