使用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
相关产品推荐
相关产品推荐

