我有两个看起来像这样的类:
@Document(collection = 'rule')
class Rule {
@Indexed(unique = true)
String name
}
@Document(collection = 'archived_rule')
class ArchivedRule extends Rule {
@Indexed(unique = false)
String name
}
规则是我的应用程序使用的主要域类。每个规则的最新版本都存储在“规则”集合中。更新规则时,会制作一份规则副本并保存在“archived_rule”集合中。
“规则”集合中的名称字段应该是唯一的。它应该能够在'archived_rule'集合中重复。
如上所述定义我的课程似乎不起作用。当我启动我的应用程序时,我得到一个像这样的例外:
Caused by: org.springframework.data.mapping.model.MappingException: Ambiguous field mapping detected! Both @org.springframework.data.mongodb.core.index.Indexed(expireAfterSeconds=-1, dropDups=false, sparse=false, useGeneratedName=false, background=false, unique=true, name=, collection=, direction=ASCENDING) private java.lang.String ...Rule.name and @org.springframework.data.mongodb.core.index.Indexed(expireAfterSeconds=-1, dropDups=false, sparse=false, useGeneratedName=false, background=false, unique=false, name=, collection=, direction=ASCENDING) private java.lang.String ...ArchivedRule.name map to the same field name name! Disambiguate using @Field annotation!
我还尝试过在ArchivedRule类中根本没有指定名称字段,但在这种情况下,它会在'archived_rule'集合的'name'字段中创建一个唯一索引。
我认为我可以通过继承使Rule和ArchivedRule无关,然后显式重新定义我需要从ArchivedRule中的Rule保存的所有字段。不过,我想避免这样做。
我是否有其他方法可以指定我的类,以便Rule.name具有唯一索引,而ArchivedRule.name没有唯一索引?
答案 0 :(得分:0)
我能够通过添加一个抽象基类来解决这个问题,该基类具有Rule和ArchivedRule都扩展自的名称之外的共享字段。然后,它们各自使用适当的索引配置定义自己的名称版本。
class RuleBase {
String sharedField
}
@Document(collection = 'rule')
class Rule extends RuleBase {
@Indexed(unique = true)
String name
}
@Document(collection = 'archived_rule')
class ArchivedRule extends RuleBase {
@Indexed(unique = false)
String name
}