Поиск в режиме гибернации: как проиндексировать B дочерних элементов родительского класса? Как получить только B объектов, содержащих один конкретный объект A, используя lucene?

#hibernate #indexing #lucene #hibernate-search #indexed

#переход в режим гибернации #индексирование #lucene #переход в режим гибернации-поиск #индексированный

Вопрос:

У меня проблема с индексацией lucene, я вставляю один индексированный объект в ассоциацию ManyToMany, но lucene индексирует не так, как я ожидал.

 @Entity  
@Indexed  
@Table(name="level")  
public class Level {  

...  
     @IndexedEmbedded
     private List<Course> courses = new ArrayList<Course>();  

     @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
     @JoinTable(name = "level_course", joinColumns = { @JoinColumn(name = "level_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "course_id", nullable = false, updatable = false) })  
@OrderColumn(name="corder")  
public List<Course> getCourses() {  
    return courses;  
}  
    ...  
}    

@Entity  
@Indexed  
@Table(name="course")  
@FullTextFilterDef(name = "filterLevel", impl = LuceneFilterFactory.class ,cache=FilterCacheModeType.NONE)  
public class Course {  
    ...
    @ContainedIn
private List<Level> levels = new ArrayList<Level>();  

    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="courses")  
public List<Level> getLevels() {  
    return levels;  
}  
}  
  

Когда я делаю :
level.getCourses().add(myCourse1);
EntityManager.save(уровень);

myCourse1 (например, с идентификатором # 10) будет правильно создан и прикреплен к level (level — родительский класс, Course — дочерний). Тогда экземпляры «Курса» хорошо проиндексированы, но если я посмотрю на индексы, сгенерированные для курса, который я ожидал найти «levels.id » со значением # 10. Но я его не нахожу. Мне нужна такая индексация, потому что я использую LuceneFilterFactory.class в курсе для фильтрации курса по одному идентификатору уровня.

Возможно, мое использование аннотаций @ContainedIn и @IndexEmbedded не подходит? Или, может быть, я совершенно неправильно делаю то, что мне нужно.

Для упрощения:
у меня есть 2 класса A и B, с множеством ассоциаций между A и B.
A является основным в отношении. A и B индексируются. Я хотел бы использовать поиск в режиме гибернации для получения B объектов, содержащих один объект A в их ассоциации ManyToMany. Я не хочу получать все B, а только B объектов, содержащих этот конкретный A.

Как это сделать?

Спасибо за вашу помощь

Комментарии:

1. где вы устанавливаете другую сторону двунаправленной ассоциации (имеется в виду обновление списка уровней в курсе?). вам необходимо обновить обе стороны ассоциации. Также помогло бы, если бы вы включили код индексирования, а также фактический поиск, который вы пытаетесь выполнить.

2. Я не задавал другую сторону, я попытался изменить отображение, поместив @IndexedEmbedded в курс класса поверх уровней свойств. А затем я обновил обе стороны ассоциации, и вы правы, теперь у меня есть результат, который я ожидал. Но есть одна важная проблема, связанная с установлением обеих сторон ассоциации :

3. Я не задавал другую сторону, я попытался изменить отображение, поместив @IndexedEmbedded в курс класса поверх уровней свойств. А затем я обновил обе стороны ассоциации, и вы правы, теперь у меня есть результат, который я ожидал. Но есть одна важная проблема при настройке обеих сторон ассоциации: level.getCourses().add(myCourse1); myCourse1.getLevels().add(level); EntityManager.save (level); ==> JPA загрузит две коллекции (level.courses и myCourse1.levels) или я ошибаюсь относительно загрузки коллекции jpa? Спасибо за вашу помощь

4. Важно установить обе стороны отношения. Это не имеет ничего общего с поиском, а является просто базовым поведением / требованием к режиму гибернации (JPA).

Ответ №1:

Вы пытались последовательно размещать аннотации? Либо все в полях, либо все в получателях?

Комментарии:

1. Я добавил больше пояснений в свой вопрос, надеюсь, это поможет, потому что я признаю, что мой вопрос был не очень ясен.

2. !!! Допустимый ответ Харди вверху: «Важно установить обе стороны отношения. Это не имеет ничего общего с поиском, а является просто базовым поведением / требованием в режиме гибернации (JPA) «. !!!