Не получается выполнить блок transaction при работе с БД. Kotlin, Exposed

Пытаюсь послать транзакции базе данных Postgre (таблица, которой адресованы транзакции, существует), с помощью фреймворка Exposed для Kotlin, но возникает ошибка, которая не даёт этого сделать. Ошибка появляется на строчке SchemaUtils.create(tableTest)

Код:

import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction

fun main(args: Array<String>) {
    val db = Database.connect("jdbc:postgresql://localhost:5432/testBase", driver = "org.postgresql.Driver", user = "user", password = "123")
    println("Database name: ${db.name}")
    transaction {
        addLogger(StdOutSqlLogger)
        SchemaUtils.create(tableTest)
        println("Mans: ${tableTest.selectAll()}")
    }
}

object tableTest: Table() {
    val id = integer("id")
    val name = text("name")
    val surname = text("surname")
    val height = integer("height")
    val phone = text("phone")

    override val primaryKey = PrimaryKey(id)
}

Ошибка:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at MainKt$main$1.invoke(main.kt:12)
    at MainKt$main$1.invoke(main.kt)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:170)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:211)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:210)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:148)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:120)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:118)
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:117)
    at MainKt.main(main.kt:10)
Caused by: java.lang.IllegalStateException: javaClass.`package` must not be null
    at org.jetbrains.exposed.sql.Table.<init>(Table.kt:306)
    at org.jetbrains.exposed.sql.Table.<init>(Table.kt:303)
    at tableTest.<init>(main.kt:30)
    at tableTest.<clinit>(main.kt:30)
    ... 12 more

Скриншот из pgAdmin:

Скриншот из pgAdmin

Build.Gradle:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4.0"
    application
}
group = "me.amd"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    jcenter()
}
dependencies {
    testImplementation(kotlin("test-junit"))
    implementation("org.jetbrains.exposed", "exposed-core", "0.26.2")
    implementation("org.jetbrains.exposed", "exposed-dao", "0.26.2")
    implementation("org.jetbrains.exposed", "exposed-jdbc", "0.26.2")
    implementation("org.postgresql:postgresql:42.2.16")
    implementation("org.slf4j", "slf4j-api", "1.7.25")
    implementation("org.slf4j", "slf4j-simple", "1.7.25")

    implementation("org.xerial:sqlite-jdbc:3.30.1")
}
tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "1.8"
}
application {
    mainClassName = "MainKt"
}

Пытался делать следующим образом:

transaction {
    addLogger(StdOutSqlLogger)
    val schema = Schema("tableTest", authorization = "postgres", password = "123456")
    SchemaUtils.setSchema(schema)
    println("Mans: ${tableTest.selectAll()}")
}

но ошибка передвинулась на строчку println("Mans: ${tableTest.selectAll()}")

Пробовал посылать запросы на SQLite — всё аналогично

Подскажите, как исправить эту ошибку и всё же отправить запрос в БД. Надеюсь на Вашу помощь!


Ответы (2 шт):

Автор решения: cenak

На англоязычном Stackoverflow подсказали решение. Необходимо вынести реализацию взаимодействия с БД в отдельный класс и package, после чего в основном файле подключить созданный package

→ Ссылка
Автор решения: Иван Макогонов

У меня была такая же проблема. Помогла перезагрузка контейнера с БД (БД работала в контейнере на VM, видимо при перезагрузке VM у меня случилось что-то с работой удаленного клиента БД).

→ Ссылка