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)
    }
}

Povýšení verze gradle v projektu

Verze použitého gradle (gradle wrapperu) je uvedena v adresar_projektu/gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

Stačí změnit verzi v řádku s distributionUrl a reload projects.

Způsob uvedený v dokumentaci je ještě jednodušší. Stačí zadat

./gradlew wrapper --gradle-version 7.2

a verze v gradle-wrapper.properties se změní.

Měření času v Kotlinu

Pro změření jak dlouho trvá vykonání určitého bloku existují v Kotlinu funkce measureTimeMillis a measureNanoTime. Měřený kód stačí vložit do bloku

val timeMillis = measureTimeMillis {
    ...
}
println("Completed in $timeMillis ms")

val timeNano = measureNanoTime {
    ...
}
println("Completed in $timeNano ns")

Co je to farmaření v kryptoměnách

Farmaření je odměna pro lidi, kteří se podílení na chodu decentralizované směnárny tím, že dané směnárně poskytují likviditu. Na decentralizovaných směnárnách si lidé vyměňují kryptoměny bez prostředníka. Aby taková výměna mohla probíhat, musí na směnárně být určité množství kryptoměn ke směně. Likviditu lidé poskytují tak, že směnárně dají k dispozici svoje kryptoměny a za to od burzy dostávají určitý poplatek. Burza zase dostává poplatky za směnu/transakce a část z nich dává právě těm, kteří jí poskytují likviditu.

Vynikající vysvětlení naleznete v tomto článku.