#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) «. !!!