【问题标题】:Kotlin exposed - Entity for table with no identity columnKotlin 暴露 - 没有标识列的表的实体
【发布时间】:2019-08-23 22:44:03
【问题描述】:

我可以在 Kotlin 公开库上找到的所有材料都假定该表具有一个主要的标识列,因此在大多数示例中显示的实体都继承了 IntEntity 抽象类。例如:

class UserLocation(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<UserLocation>(UserLocations)

    var userId by UserLocations.userId
    var user by User referencedOn UserLocations.user
    var recordedAt by UserLocations.recordedAt
    var insertedAt by UserLocations.insertedAt
    var point by UserLocations.point

并且对应这个表定义:

object UserLocations : IntIdTable("user_locations") {

    val userId = integer("user_id")
    val user = reference("user_id", Users)
    val recordedAt = datetime("recorded_at").nullable()
    val insertedAt = datetime("inserted_at")
    val point = point("point")
}

问题是,我的表实际上没有标识列。我知道没有主键的表的所有负面影响,但不幸的是我只有对该表的读取权限。我无法获得对该表的写入权限来添加主键。

在公开库的 wiki 中,它提到对象表定义可以继承 Table 而不是 IntIdTable,但这需要实体继承一些不同的东西,我无法完全找到实体应该继承而不是IntEntity

我的问题:当表没有 id 列时,我的实体应该继承什么(而不是 IntEntity)。

【问题讨论】:

  • 你能显示你想要使用的当前表定义吗?

标签: sql postgresql kotlin primary-key kotlin-exposed


【解决方案1】:

暴露的 DAO 需要一些身份才能从表中获取和存储实体。它不需要是主列或自增列,但在这种情况下,您必须确保该列中的值是唯一的。

例如,您可以将实体映射到具有字符串 id 的表:

object FooTable : IdTable<String>() {
    val myIdColumn = varchar("my_id_column", 50).uniqueIndex()
    override val id: Column<EntityID<String>> = myIdColumn.entityId()
}

class FooEntity(id: String) : Entity<String>(id) {
    companion object : EntityClass<String, FooEntity>(FooTable)
}

【讨论】:

    【解决方案2】:

    Kotlin 公开的 API 包含两个部分。它带有一个 DAO API 和一个 DSL API。有关详细信息,请参阅readme。如果您没有某种 id 表/主键,则需要使用 DSL API。 DSL API 更接近于原始 SQL,但仍然可以防止 SQL 注入之类的东西,并且是类型安全的。

    简而言之,你想做的事情不能/不应该做,改用 DSL API。

    【讨论】:

    • 能否在一个数据库中同时使用 Dao 对象和 Dsl 对象,并在两者之间进行引用?
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2018-02-16
    • 2021-02-04
    相关资源
    最近更新 更多