我在使用Hibernate搜索索引嵌入式文本实体时遇到了一些问题。 由于实体扩展了我无法更改的其他实体,因此使用注释是不可行的。
因此,我使用程序化API进行映射。但是,Hibernate搜索不会对嵌入的文本实体建立索引。
以下是实体模型的简短示例(为简单起见而简化):
@Entity
class Article {
@Id
private long uid;
private String articleNumber;
@OneToMany ( mappedBy = "article" )
@MapKey( name = "languageCode" )
private Map<String, ArticleText> texts;
...
}
@Entity
class ArticleText {
@ManyToOne
private ArticleEntity article;
private String languageCode;
private String someText;
...
}
@Entity
class SpecialArticle extends Article {
private String someSpecialAttribute;
}
以下是地图的摘录:
SearchMapping mapping = ...;
mapping.entity( SpecialArticle.class )
.indexed()
.property( "uid", ElementType.FIELD ).documentId()
.property( "articleNumber", ElementType.FIELD ).field()
.property( "someSpecialAttribute", ElementType.FIELD ).field()
.property( "texts", ElementType.FIELD )
.indexEmbedded().targetElement( ArticleText.class ).entity( ArticleText.class )
.property( "article", ElementType.FIELD ).containedIn()
.property( "someText", ElementType.FIELD ).field();
关于使用.indexEmbedded().entity(...)
的文档不是很清楚,但我有另一个嵌入式实体(多对一关联),它只使用类似的映射进行索引。
我怀疑由于使用了地图而Hibernate Search无法将该属性标识为地图,因此未映射文本。有MapBrigde
和BuildInMapBridge
,但在构建映射时似乎没有使用它们。
我可能缺少什么或错误在哪里?
顺便说一句,我在Hibernate Search 4.0.1和Hibernate 4.0.1环境中这样做。
答案 0 :(得分:2)
好像我找到了解决方案。由于文档似乎并不清楚,我将在此处添加以供其他人查找。
问题似乎是对文本的引用是超类Article
的一个字段,因此当映射SpecialArticle
时,Hibernate Search似乎有困难。
为了使它工作,必须改变映射以包括超类:
SearchMapping mapping = ...;
mapping.entity( SpecialArticle.class )
.indexed()
.property( "uid", ElementType.FIELD ).documentId()
.property( "someSpecialAttribute", ElementType.FIELD ).field();
//Map the super class directly, but don't call "indexed()"
mapping.entity( Article.class )
.property( "articleNumber", ElementType.FIELD ).field()
.property( "texts", ElementType.FIELD )
.indexEmbedded().targetElement( ArticleText.class ).entity( ArticleText.class )
.property( "article", ElementType.FIELD ).containedIn()
.property( "someText", ElementType.FIELD ).field();
奇怪的是,问题也发生在articleNumber
但不会发生在uid
上(可能是因为documentId()
)。