@IndexedEmbedded嵌套标注时Hibernate Search报索引字段重复错误如何解决
错误根因
你在BaseProfile基类中对personalities、lifestyles、languages三个集合字段同时添加了@GenericField和@IndexedEmbedded注解:
@GenericField会直接以字段名作为索引字段名,存储枚举的字符串值@IndexedEmbedded默认也会以字段名作为嵌入字段的前缀,生成同名字段根路径
两者冲突导致索引字段重复定义,Profile、Search类的报错也是因为同样继承了BaseProfile导致的。
解决方案
根据业务需求三选一即可:
方案1:仅需索引枚举本身的值(无嵌套字段需求)
如果只需要查询枚举的字符串值,不需要用到枚举内部的其他字段做索引,删除三个集合字段上的@IndexedEmbedded注解即可:
@Enumerated(EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) @GenericField private Set<Personality> personalities; @Enumerated(EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) @GenericField private Set<Lifestyle> lifestyles; @ElementCollection(fetch = FetchType.EAGER) @GenericField private Set<Language> languages;
方案2:需要索引枚举内部的嵌套字段
如果Personality/Lifestyle/Language中还有其他需要索引的属性,删除三个集合字段上的@GenericField注解即可:
@Enumerated(EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) @IndexedEmbedded private Set<Personality> personalities; @Enumerated(EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) @IndexedEmbedded private Set<Lifestyle> lifestyles; @ElementCollection(fetch = FetchType.EAGER) @IndexedEmbedded private Set<Language> languages;
如果同时需要存储枚举本身的字符串值,在对应的枚举类内部,对枚举值的对应属性添加@GenericField注解即可。
方案3:同时需要两种索引
如果确实需要同时保留枚举值的直接索引和嵌套字段索引,手动给两个注解指定不同的字段名避免冲突:
@Enumerated(EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) @GenericField(name = "personalities_value") @IndexedEmbedded(name = "personalities_detail") private Set<Personality> personalities; // 其余两个字段同理修改
你在Insertion类中matePreferences字段上配置的@IndexedEmbedded(name = "insertion_mate_preferences")属于正常的前缀配置,和本次错误无关,无需修改。
内容的提问来源于stack exchange,提问作者G. Colaianni
相关产品推荐
相关产品推荐

