You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin Exposed中创建关联Table类的实体并插入?

问题

我尝试为自定义Table类创建对应实体,代码如下:

import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.Table

object TestTable: Table("tests") {
  val id: Column<Long> = long("id").autoIncrement()
  val name: Column<String> = varchar("name", 32)

  override val primaryKey = PrimaryKey(id, name="pk_test_id")
}

class Test (id: EntityID<Long>): Entity<Long>(id) {

}

目前我通过以下方式实现插入并获取ID:

val testId = TestTable.insert {
  it[name] = "test_name_1"
} get TestTable.id

请问是否可以先创建实体对象(如val testEntity = Test()),再将其插入数据库?且我不需要使用Exposed文档中的IntTable、StringTable等实现方案,仅使用Table类。

回答

可以实现先创建实体对象再插入数据库,核心是完善实体类的字段映射,并通过EntityClass关联实体与自定义Table,无需依赖IntTable这类封装类,具体实现步骤如下:

1. 完善实体类与表关联

给Test实体添加字段映射,并通过伴生对象继承EntityClass来关联TestTable:

import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.Table

object TestTable: Table("tests") {
  val id: Column<Long> = long("id").autoIncrement()
  val name: Column<String> = varchar("name", 32)

  override val primaryKey = PrimaryKey(id, name="pk_test_id")
}

class Test(id: EntityID<Long>) : Entity<Long>(id) {
  // 使用by委托自动映射表字段
  var name by TestTable.name

  // 伴生对象关联实体与表
  companion object : EntityClass<Long, Test>(TestTable)
}

2. 创建实体并插入数据库

方式一:直接创建并持久化

使用Test.new方法创建实体,内部会自动完成插入操作:

// 创建实体并自动插入数据库
val testEntity = Test.new {
  name = "test_name_1"
}

// 获取插入后的ID
val testId = testEntity.id.value

方式二:先创建临时实体,后续再插入

如果需要先构造未持久化的实体,之后再手动插入,可以这样处理:

// 创建临时实体(暂未关联数据库)
val testEntity = Test(EntityID(0, TestTable))
testEntity.name = "test_name_2"

// 手动执行插入并更新实体ID
testEntity.id = TestTable.insertAndGetId {
  it[name] = testEntity.name
}

这种方式需要手动管理ID的赋值,适合需要先组装实体属性、延迟插入的场景。

关键说明

  • EntityClass是Exposed ORM模式中关联实体与表的核心组件,完全兼容自定义Table类,不需要依赖封装好的IntTable/StringTable。
  • 使用by委托可以自动完成实体属性与表字段的绑定,无需手动编写属性的get/set逻辑,简化代码。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:20:26