2013-07-30 112 views
1

我在使用Hibernate搜索索引嵌入式文本實體時遇到了一些問題。 由於實體擴展了我無法更改的其他實體,因此使用註釋是不可行的。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(); 

文檔ISN」我很清楚使用.indexEmbedded().entity(...),但我有另一個嵌入式實體(多對一關聯),它只使用類似的映射進行索引。

我懷疑文本沒有被映射,因爲正在使用的地圖和Hibernate搜索無法將屬性標識爲地圖。有一個MapBrigde以及一個BuildInMapBridge但他們似乎並沒有被用於建立映射。

我可能會丟失什麼或錯誤在哪裏?

順便說一句,我在Hibernate Search 4.0.1和Hibernate 4.0.1環境中執行此操作。

回答

1

看來我已經找到了解決方案。由於文檔似乎並不清楚,所以我將其添加到此處供其他人查找。

問題似乎是對文本的引用是超類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() )。