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=? 

Chyba: TransactionRequiredException Executing an update/delete query

Pro repository test na Micronautovi jsem dostával chybu TransactionRequiredException Executing an update/delete query při exekuci sql skriptu ze souboru.

@Inject
lateinit var entityManager: EntityManager
...
val fileNameString = "/db/script/$fileName"
val sql = this::class.java.getResource(fileNameString)?.readText()
entityManager.createNativeQuery(sql).executeUpdate()

Řešením bylo použití SessionFactory a transakcí

@Inject
lateinit var sessionFactory: SessionFactory
...
val fileNameString = "/db/script/$fileName"
val sql = this::class.java.getResource(fileNameString)?.readText()
sessionFactory.openSession()
    ?.let { session ->
        session.entityManagerFactory.createEntityManager()
            ?.let { entityManager ->
                entityManager.transaction.begin()
                entityManager.createNativeQuery(sql).executeUpdate()
                entityManager.transaction.commit()
            }
    }

Vararg a spread operátory v Kotlinu

Hvězdička (*) je spread operátor, který rozbalí pole do seznamu hodnot.
Parametr vararg umožňuje předat do funkce libovolné množství argumentů. Každá funkce může mít maximálně jeden vararg operátor.

fun main() {
    val lines = arrayOf("First line", "Second line")
    
    printOnLines("")
    
    printOnLines(header = "Header")
    
    printOnLines(header = "Header", lines = lines)

    printOnLines(header = "Header", lines = arrayOf("First line", "Second line"))
    
    printOnLines("Header", *lines)

    printOnLines(header = "Header", *lines)
    
    printOnLines("Header", "First line", "Second line")

    printLines(*lines)
}

fun printOnLines(header: String, vararg lines: String) {
    println(header)
    println("----------------------------")
    lines.forEach {
        println(it)
    }
}

fun printLines(vararg lines: String) {
    lines.forEach { 
        println(it)
    }
}