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

Kotlin继承报错:Ambiguous field mapping字段映射歧义求助

解决Spring Data MongoDB字段映射歧义问题

问题原因

错误源于父类Partner与子类MerchantAgent的name、address属性被Spring Data MongoDB识别为独立字段,同时映射到MongoDB文档的同一个字段名,导致映射冲突。


方案一:将父类标记为映射超类(推荐)

把父类Partner的@Document注解替换为@MappedSuperclass,明确它是仅用于属性继承的基类,而非独立文档类型。Spring Data会自动将父类属性合并到子类的映射逻辑中,消除冲突。

修改后的代码:

// 父类改为映射超类
@MappedSuperclass
open class Partner {
    @Id
    open lateinit var partnerId: String
    lateinit var code: String
    open lateinit var name: String
    open lateinit var address: String
}

@Document(collection = "partner")
@TypeAlias("merchant_agent")
data class MerchantAgent(
        override var name: String,
        override var address: String,
        var globalId: String,
        var idTerminal: String
) : Partner() {
    fun update(form: MerchantAgent): MerchantAgent {
        return this.copy(
                name = form.name,
                address = form.address,
                globalId = form.globalId,
                idTerminal = form.idTerminal
        )
    }
}

方案二:移除父类属性的open修饰符,子类不重写属性

如果不需要在其他子类中重写name和address,可以去掉父类中这两个属性的open修饰符,子类不再重写,而是通过构造函数初始化父类属性。

修改后的代码:

@Document(collection = "partner")
open class Partner {
    @Id
    open lateinit var partnerId: String
    lateinit var code: String
    // 移除open修饰符
    lateinit var name: String
    lateinit var address: String
}

@Document(collection = "partner")
@TypeAlias("merchant_agent")
data class MerchantAgent(
        name: String,
        address: String,
        var globalId: String,
        var idTerminal: String
) : Partner() {
    // 初始化父类属性
    init {
        this.name = name
        this.address = address
    }

    fun update(form: MerchantAgent): MerchantAgent {
        this.name = form.name
        this.address = form.address
        this.globalId = form.globalId
        this.idTerminal = form.idTerminal
        return this
    }
}

方案三:用@Field明确指定字段映射

在子类的重写属性上添加@Field注解,明确指定映射到同一个字段名,告诉Spring Data这两个属性对应文档的同一个字段。

修改后的代码:

@Document(collection = "partner")
open class Partner {
    @Id
    open lateinit var partnerId: String
    lateinit var code: String
    open lateinit var name: String
    open lateinit var address: String
}

@Document(collection = "partner")
@TypeAlias("merchant_agent")
data class MerchantAgent(
        @Field("name")
        override var name: String,
        @Field("address")
        override var address: String,
        var globalId: String,
        var idTerminal: String
) : Partner() {
    fun update(form: MerchantAgent): MerchantAgent {
        return this.copy(
                name = form.name,
                address = form.address,
                globalId = form.globalId,
                idTerminal = form.idTerminal
        )
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:30:51