消除Spring Data中已编译的类的歧义

时间:2019-03-29 12:30:35

标签: mongodb spring-boot spring-data-mongodb

我正在尝试使用Spring在MongoDB中编写文档,并且得到了org.springframework.data.mapping.MappingException: Ambiguous field mapping detected!

问题在于这种歧义来自于一个编译类,该编译类继承自另一个编译类,因此我不能使用@Field注释手动更改字段名称。

有什么方法可以告诉Spring如何在不修改类代码的情况下解决歧义字段映射吗?

我要坚持的课程如下:

data class BehaviouralEvent(
    val sources: Set<BehaviouralEvent>,
    override val activity: Activity,
    override val start: Instant = Instant.now(),
    override val end: Instant = Instant.now(),
    override val lifecycle: Lifecycle = Lifecycle.UNKNOWN
) : Event(activity, start, end, lifecycle) {

    constructor(
        sources: Set<BehaviouralEvent>,
        activityID: String,
        start: Instant = Instant.now(),
        end: Instant = Instant.now(),
        lifecycle: Lifecycle = Lifecycle.UNKNOWN
    ) : this(sources, Activity.from(activityID), start, end, lifecycle)

    constructor(
        sources: Set<BehaviouralEvent>,
        event: Event
    ) : this(sources, event.activity, event.start, event.end, event.lifecycle)
}

当我尝试使用这种结构(MongoRepository<BehaviouralEvent, String>)保存文档时,我得到了所有覆盖属性(活动,开始,结束和生命周期)的模糊字段映射。

赞赏任何想法或解决方法。

1 个答案:

答案 0 :(得分:0)

tl; dr 在撰写本文时,尚无法解决此问题。

当前,映射层无法判断如果一个“阴影”另一个属性,则应保留哪个属性。因此,我们在实体元数据中进行了此检查。

现在,如果您尝试通过添加诸如以下内容

,稍微放松一下BasicMongoPersistentEntity中的唯一字段检查Kotlin类型,
if(isKotlinType(property.getOwner()) && !propety.hasGetter()) {
    return;
}

存储库在创建时将不再抱怨。但是,映射层仍需要确定要保留的显示属性中的哪一个(取决于检查顺序),它们仍然会相互覆盖,并且很可能最终会以错误的状态保留下来。特别是在用val覆盖var时。

我已经打开DATAMONGO-2250进行进一步调查,看看我们是否可以对此做些事情。