2013-05-16 4 views
1

У меня есть простой код, который проверяет поисковую систему в Infinispan.Конфигурация отображения поиска наследования Infinispan

public class InifinispanTest { 

    private static class DemoA { 
     private Long id; 

     public Long getId() { 
      return id; 
     } 

     public void setId(Long id) { 
      this.id = id; 
     } 
    } 

    private static class DemoB extends DemoA { 
     private String value; 

     public String getValue() { 
      return value; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     SearchMapping mapping = new SearchMapping(); 
     mapping.entity(DemoB.class).indexed().providedId() 
       .property("id", ElementType.METHOD).field(); 

     Properties properties = new Properties(); 
     properties.put(org.hibernate.search.Environment.MODEL_MAPPING, mapping); 
     properties.put("hibernate.search.default.directory_provider", "ram"); 
     properties.put("hibernate.search.default.indexmanager", "near-real-time"); 

     Configuration infinispanConfiguration = new ConfigurationBuilder() 
       .indexing() 
       .enable() 
       .indexLocalOnly(true) 
       .withProperties(properties) 
       .loaders().passivation(true).addFileCacheStore() 
       .build(); 

     DefaultCacheManager cacheManager = new DefaultCacheManager(infinispanConfiguration); 

     final Cache<Integer, DemoB> cache = cacheManager.getCache(); 

     for (int i = 0; i < 10000; i++) { 
      final DemoB demo = new DemoB(); 
      demo.setId((long) i); 

      cache.put(i, demo); 
     } 

     final SearchManager searchManager = Search.getSearchManager(cache); 
     final QueryBuilder queryBuilder = searchManager.buildQueryBuilderForClass(DemoB.class).get(); 

     final Query query = queryBuilder.keyword().onField("id").matching(1000l).createQuery(); 

     final CacheQuery query1 = searchManager.getQuery(query, DemoB.class); 

     for (Object result : query1.list()) { 
      System.out.println(result); 
     } 

    } 
} 

Как вы можете видеть, что есть базовый класс DemoA и его подкласс дембеля. Я хотел бы выполнить поиск по файлу id суперкласса. Однако этот демо-код генерирует org.hibernate.search.SearchException: Unable to find field id in com.genesis.inifispan.InifinispanTest$DemoB

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

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

ответ

1

При использовании SearchMapping вы должны указать поля, как вы бы с аннотациями: идентификатора является допустимым поле для DemoA только, следовательно, правильное отображение выглядит как:

SearchMapping mapping = new SearchMapping() 
    .entity(DemoA.class) 
     .property("id", ElementType.METHOD).field() 
    .entity(DemoB.class).indexed() 
    ; 

Также отметит, I удален providedId(): больше не требуется в последних версиях Infinispan.

Я думаю, что SearchMapping должен хотя бы предупредить вас, возможно, даже выбросить немедленное исключение: открытие JIRA HSEARCH-1328.

+0

Эта конфигурация позволяет наследование. Благодарю. BTW, id = 1000 в кеше, вызывают мой цикл за 10'000 ;-) –

+0

hooo right :) Я поправлю ответ – Sanne

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