JetBrains / Exposed

Kotlin SQL Framework
http://jetbrains.github.io/Exposed/
Apache License 2.0
8.25k stars 689 forks source link

Exception on optional reference #655

Open Proximyst opened 4 years ago

Proximyst commented 4 years ago

So I have this table structure:

package com.proximyst.marivictus.common.sql

import com.proximyst.marivictus.common.playerwarp.MemberLevel
import org.jetbrains.exposed.dao.EntityID
import org.jetbrains.exposed.dao.UUIDEntity
import org.jetbrains.exposed.dao.UUIDEntityClass
import org.jetbrains.exposed.dao.UUIDTable
import java.util.*

object TownTable : UUIDTable("marivictus_towns") {
    var name = varchar("name", 200)
    var owner = uuid("owner").uniqueIndex()
    var server = varchar("server", 50)
    var creationDate = long("creationDate").clientDefault { System.currentTimeMillis() }
    var item = mediumtext("item")
    var approval = uuid("approval").nullable()

    var spawnX = double("spawnX")
    var spawnY = double("spawnY")
    var spawnZ = double("spawnZ")
    var spawnYaw = float("spawnYaw")
    var spawnPitch = float("spawnPitch")
    var spawnWorld = varchar("spawnWorld", 200)
}

object TownMemberTable : UUIDTable("marivictus_towns_members") {
    var town = optReference("town", TownTable) // exception points here I believe
    var level = enumeration("level", MemberLevel::class).nullable()
}

class Town(id: EntityID<UUID>) : UUIDEntity(id) {
    companion object : UUIDEntityClass<Town>(TownTable)

    var name by TownTable.name
    var owner by TownTable.owner
    var server by TownTable.server
    var creationDate by TownTable.creationDate
    var item by TownTable.item
    val members by TownMember optionalReferrersOn TownMemberTable.town
    var approval by TownTable.approval

    var spawnX by TownTable.spawnX
    var spawnY by TownTable.spawnY
    var spawnZ by TownTable.spawnZ
    var spawnYaw by TownTable.spawnYaw
    var spawnPitch by TownTable.spawnPitch
    var spawnWorld by TownTable.spawnWorld
}

class TownMember(id: EntityID<UUID>) : UUIDEntity(id) {
    companion object : UUIDEntityClass<TownMember>(TownMemberTable)

    var town by Town optionalReferencedOn TownMemberTable.town
    var level by TownMemberTable.level
}

When it runs the following, it throws an exception which I cannot for the life of me figure out:

        mariTransaction {
            SchemaUtils.createMissingTablesAndColumns(
                KeepInvTable,
                PvpTable,
                ColourChatTable,
                InventoryTable,

                ShopTable,

                TownTable,
                TownMemberTable
            )
        }

mariTransaction is simply transaction but with the ability to print SQL automatically, if configured to do so in a file.

The exception thrown is as follows:

[15:38:48] [Server thread/ERROR]: Error occurred while enabling Marivictus-Spigot v0.1.0 (Is it up to date?)
java.lang.AssertionError: Built-in class com.proximyst.marivictus.spigot.dependencies.kotlin.Any is not found
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns$3.invoke(KotlinBuiltIns.java:113) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns$3.invoke(KotlinBuiltIns.java:108) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:440) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:515) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getBuiltInClassByName(KotlinBuiltIns.java:362) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getAny(KotlinBuiltIns.java:367) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getAnyType(KotlinBuiltIns.java:642) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.descriptors.NotFoundClasses$MockClassDescriptor.<init>(NotFoundClasses.kt:59) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.descriptors.NotFoundClasses$classes$1.invoke(NotFoundClasses.kt:43) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.descriptors.NotFoundClasses$classes$1.invoke(NotFoundClasses.kt:21) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:440) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:515) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.descriptors.NotFoundClasses.getClass(NotFoundClasses.kt:91) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer$typeConstructor$1.invoke(TypeDeserializer.kt:109) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.typeConstructor(TypeDeserializer.kt:113) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.simpleType(TypeDeserializer.kt:75) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.type(TypeDeserializer.kt:63) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassTypeConstructor.computeSupertypes(DeserializedClassDescriptor.kt:173) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:34) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:22) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor.getSupertypes(AbstractTypeConstructor.kt:23) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getNonDeclaredVariableNames(DeserializedClassDescriptor.kt:284) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:77) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:40) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNamesLazy(DeserializedMemberScope.kt) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNames(DeserializedMemberScope.kt:85) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getNonDeclaredVariableNames(DeserializedClassDescriptor.kt:285) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:77) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:40) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNamesLazy(DeserializedMemberScope.kt) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNames(DeserializedMemberScope.kt:85) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getNonDeclaredVariableNames(DeserializedClassDescriptor.kt:285) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:77) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$variableNamesLazy$2.invoke(DeserializedMemberScope.kt:40) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNamesLazy(DeserializedMemberScope.kt) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.getVariableNames(DeserializedMemberScope.kt:85) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.addFunctionsAndProperties(DeserializedMemberScope.kt:210) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.computeDescriptors(DeserializedMemberScope.kt:181) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope$allDescriptors$1.invoke(DeserializedClassDescriptor.kt:210) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope$allDescriptors$1.invoke(DeserializedClassDescriptor.kt:203) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getContributedDescriptors(DeserializedClassDescriptor.kt:215) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.impl.resolve.scopes.ResolutionScope$DefaultImpls.getContributedDescriptors$default(ResolutionScope.kt:52) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KDeclarationContainerImpl.getMembers(KDeclarationContainerImpl.kt:64) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data$declaredNonStaticMembers$2.invoke(KClassImpl.kt:159) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data$declaredNonStaticMembers$2.invoke(KClassImpl.kt:44) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data.getDeclaredNonStaticMembers(KClassImpl.kt) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data$allNonStaticMembers$2.invoke(KClassImpl.kt:168) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data$allNonStaticMembers$2.invoke(KClassImpl.kt:44) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.jvm.internal.KClassImpl$Data.getAllNonStaticMembers(KClassImpl.kt) ~[?:?]
    at com.proximyst.marivictus.spigot.dependencies.kotlin.reflect.full.KClasses.getMemberProperties(KClasses.kt:149) ~[?:?]
    at org.jetbrains.exposed.sql.Table.clone(Table.kt:226) ~[?:?]
    at org.jetbrains.exposed.sql.Table.clone$default(Table.kt:224) ~[?:?]
    at org.jetbrains.exposed.sql.Table.cloneAsBaseType(Table.kt:222) ~[?:?]
    at org.jetbrains.exposed.sql.Table.entityId(Table.kt:216) ~[?:?]
    at org.jetbrains.exposed.sql.Table.optReference(Table.kt:415) ~[?:?]
    at org.jetbrains.exposed.sql.Table.optReference$default(Table.kt:414) ~[?:?]
    at com.proximyst.marivictus.common.sql.TownMemberTable.<clinit>(TownTable.kt:27) ~[?:?]
    at com.proximyst.marivictus.spigot.Marivictus$onEnable$4.invoke(Marivictus.kt:161) ~[?:?]
    at com.proximyst.marivictus.spigot.Marivictus$onEnable$4.invoke(Marivictus.kt:56) ~[?:?]
    at com.proximyst.marivictus.common.ext.TransactionKt$mariTransaction$1.invoke(transaction.kt:23) ~[?:?]
    at com.proximyst.marivictus.common.ext.TransactionKt$mariTransaction$1.invoke(transaction.kt) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:156) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:197) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:204) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:196) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:134) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:204) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:106) ~[?:?]
    at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:104) ~[?:?]
    at com.proximyst.marivictus.common.ext.TransactionKt.mariTransaction(transaction.kt:21) ~[?:?]
    at com.proximyst.marivictus.common.ext.TransactionKt.mariTransaction$default(transaction.kt:20) ~[?:?]
    at com.proximyst.marivictus.spigot.Marivictus.onEnable(Marivictus.kt:151) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.14.4.jar:git-Paper-187]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:338) ~[patched_1.14.4.jar:git-Paper-187]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:420) ~[patched_1.14.4.jar:git-Paper-187]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugin(CraftServer.java:467) ~[patched_1.14.4.jar:git-Paper-187]
    at org.bukkit.craftbukkit.v1_14_R1.CraftServer.enablePlugins(CraftServer.java:381) ~[patched_1.14.4.jar:git-Paper-187]
    at net.minecraft.server.v1_14_R1.MinecraftServer.a(MinecraftServer.java:474) ~[patched_1.14.4.jar:git-Paper-187]
    at net.minecraft.server.v1_14_R1.DedicatedServer.init(DedicatedServer.java:290) ~[patched_1.14.4.jar:git-Paper-187]
    at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:870) ~[patched_1.14.4.jar:git-Paper-187]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]

I've relocated kotlin via Shadow:

    val relocate: (packages: Array<String>, noRelocate: Array<String>) -> Unit by extra { packages, noRelocate ->
        tasks.withType<ShadowJar> {
            val project = if (this@subprojects == rootProject) {
                project.name
            } else {
                "${rootProject.name}.${project.name}"
            }
            val prefix = "com.proximyst.$project.dependencies"
            packages.forEach {
                    relocate(it, "$prefix.$it") {
                        noRelocate.forEach {
                            exclude(it)
                        }
                    }
            }
        }
    }
// used in the module:

val relocate: (packages: Array<String>, Array<String>) -> Unit by extra
relocate(arrayOf("kotlin"), arrayOf())

Kotlin version: 1.3.50 Exposed version: 0.17.3 HikariCP (datasource) version: 3.3.1 Shadow version: 5.1.0 MySQL version: 14.14; distrib: 5.7.27; EditLine wrapper (? - just results of mysql --version)

Tapac commented 4 years ago

Looks like the problem is that you relocate kotlin.Any class. But it's unrelated to an Exposed.

Proximyst commented 4 years ago

How would me relocating it trigger an assertion error, though? Why is that a thing at all? If the library can find the class in its relocated form, which it obviously can, it should just go on and do whatever it's supposed to, not crash the software.

Katekko commented 4 years ago

I'm getting this issue too. How can I fix it?

ChimpGamer commented 4 years ago

I have the same issue when relocating the kotlin packages.

Tapac commented 4 years ago

@ChimpGamer could you share a sample project?