如何在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
相关产品推荐
相关产品推荐

