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

