1

我在使用 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 无法将该属性识别为地图。有 aMapBrigde和 aBuildInMapBridge但是在构建映射时似乎没有使用它们。

我可能会丢失什么或错误可能在哪里?

顺便说一句,我在 Hibernate Search 4.0.1 和 Hibernate 4.0.1 环境中执行此操作。

4

1 回答 1

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())。

于 2013-07-30T16:23:34.980 回答