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

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:36:02