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

使用Exposed的IdTable创建复合主键时遇DuplicateColumnException错误如何解决

修复DuplicateColumnException的方案

问题出在IdTable本身默认会自动生成名为id的主键列,你既重写了id属性,又自定义了复合主键,导致id列被重复声明,触发了重复列错误。

要使用复合主键,正确的做法是直接继承Table而非IdTable——因为IdTable是为单主键场景设计的,强行在它上面改复合主键会违背其设计逻辑。调整后的代码如下:

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

// 定义复合主键的键类型,用来绑定实体ID
data class MyTableKey(val username: String, val cat1: String)

object MyTable : Table("MyTable") {
    val username = varchar("username", 64)
    val cat1 = varchar("cat1", 12)

    // 声明复合主键
    override val primaryKey = PrimaryKey(username, cat1)
}

// 如果需要实体类,用CompositeEntityID来适配复合主键
class MyEntity(id: CompositeEntityID<MyTableKey>) : Entity<MyTableKey>(id) {
    companion object : EntityClass<MyTableKey, MyEntity>(MyTable)

    var username by MyTable.username
    var cat1 by MyTable.cat1
}

如果硬要基于IdTable修改(不推荐,会混淆单主键语义),你需要删除自定义的id重写,同时确保复合主键覆盖默认的单主键,但这种方式容易引发后续逻辑混乱,所以优先推荐上面的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:02