2013-07-30 3 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» t совершенно ясно об использовании .indexEmbedded().entity(...), но у меня есть еще одна внедренная сущность (ассоциация «много-к-одному»), которая только индексируется с использованием аналогичного сопоставления.

Я подозреваю, что текст не отображается из-за используемой карты, а поиск в спящем режиме не может идентифицировать свойство как карту. Существует MapBrigde, а также BuildInMapBridge, но они, похоже, не используются, когда построено сопоставление.

Что я могу потерять или где может быть ошибка?

Btw, я делаю это в среде спящего режима 4.0.1 и Hibernate 4.0.1.

ответ

1

Кажется, что я нашел решение. Поскольку документация не кажется мне очевидной, я добавлю ее сюда, чтобы другие могли ее найти.

Проблема заключается в том, что ссылка на тексты является полем суперкласса Article и, таким образом, когда отображается SpecialArticle, поиск в спящем режиме, похоже, имеет трудности.

Чтобы заставить его работать, отображение должно быть изменено, чтобы включать в себя супер-класс, а также:

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

Смежные вопросы