Kotlin 暴露 - table 的实体没有标识列
Kotlin exposed - Entity for table with no identity column
我在 Kotlin 公开库中可以找到的所有 material 都假定 table 具有主标识列,因此在大多数示例中显示的实体都继承了 IntEntity
摘要 class。例如:
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
这对应于这个 table 定义:
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")
}
问题是,我的 table 实际上没有标识列。我知道 table 没有主键的所有负面影响,但不幸的是我只有对这个 table 的读取权限。我无法获得对此 table 的写入权限以添加主键。
在暴露库的 wiki 中的某个时刻,它提到对象 table 定义可以继承 Table
而不是 IntIdTable
,但是这需要实体继承某些东西不同,我无法完全找到实体应该继承什么而不是 IntEntity
。
我的问题:当 table 没有 id 列时,我的实体应该继承什么(而不是 IntEntity
)。
公开的 Kotlin API 包含两个部分。它带有一个 DAO API 和一个 DSL API。有关详细信息,请参阅 readme。如果您没有某种 id table/primary 密钥,则需要使用 DSL API。 DSL API 更接近原始 SQL,但仍会防止 SQL 注入之类的东西,并且是类型安全的。
简而言之,你想做的事't/shouldn做不到,请改用DSL API。
Exposed DAO 需要一些身份才能从 table 中获取和存储实体。它不需要是主列或自动递增列,但在这种情况下,您必须确保该列中的值是唯一的。
例如,您可以将实体映射到 Table,字符串 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)
}
我在 Kotlin 公开库中可以找到的所有 material 都假定 table 具有主标识列,因此在大多数示例中显示的实体都继承了 IntEntity
摘要 class。例如:
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
这对应于这个 table 定义:
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")
}
问题是,我的 table 实际上没有标识列。我知道 table 没有主键的所有负面影响,但不幸的是我只有对这个 table 的读取权限。我无法获得对此 table 的写入权限以添加主键。
在暴露库的 wiki 中的某个时刻,它提到对象 table 定义可以继承 Table
而不是 IntIdTable
,但是这需要实体继承某些东西不同,我无法完全找到实体应该继承什么而不是 IntEntity
。
我的问题:当 table 没有 id 列时,我的实体应该继承什么(而不是 IntEntity
)。
公开的 Kotlin API 包含两个部分。它带有一个 DAO API 和一个 DSL API。有关详细信息,请参阅 readme。如果您没有某种 id table/primary 密钥,则需要使用 DSL API。 DSL API 更接近原始 SQL,但仍会防止 SQL 注入之类的东西,并且是类型安全的。
简而言之,你想做的事't/shouldn做不到,请改用DSL API。
Exposed DAO 需要一些身份才能从 table 中获取和存储实体。它不需要是主列或自动递增列,但在这种情况下,您必须确保该列中的值是唯一的。
例如,您可以将实体映射到 Table,字符串 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)
}