J'ai un problème avec l'indexation de lucene, j'insère une entité indexée dans une association manyToMany mais lucene n'indexe pas comme je m'attendais.Hibernate search: Comment indexer les enfants B d'une classe parent A? Comment obtenir uniquement des objets B contenant un objet spécifique A en utilisant 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;
}
}
Quand je fais: level.getCourses() ajouter (myCourse1);. entityManager.save (niveau); MyCourse1 (avec ID # 10 par exemple) sera bien créé et attaché au niveau (le niveau est la classe parente, le cours est l'enfant)
Alors les instances de "Cours" sont bien indexées mais si je regarde les index générés pour le cours, je m'attendais à trouver "levels.id" avec la valeur # 10. Mais je ne le trouve pas. J'ai besoin de ce type d'indexation car j'utilise LuceneFilterFactory.class sur Course pour filtrer le cours d'un seul niveau.
Peut-être que mon utilisation des annotations @ContainedIn et @IndexEmbedded n'est pas bonne? Ou peut-être que je suis complètement dans le mauvais sens pour faire ce dont j'ai besoin.
Pour simplifier:
J'ai 2 classes A et B, avec une association de ManyToMany entre A et B. A est
maître sur la relation. A et B sont indexés. Je voudrais utiliser la recherche hibernate pour obtenir des objets B contenant un objet A dans leur association manyToMany. Je ne veux pas obtenir tous les objets B mais seulement B qui contient cet A spécifique.
Comment faire?
Merci pour votre aide
où définissez-vous l'autre côté de l'association bidirectionnelle (ce qui signifie mettre à jour la liste des niveaux dans le cours?). vous devez mettre à jour les deux côtés de l'association. Il serait également utile si vous incluez le code d'indexation ainsi que la recherche réelle que vous essayez d'exécuter. – Hardy
Je n'ai pas mis l'autre côté, j'ai essayé de changer le mapping en mettant @IndexedEmbedded dans la classe Course sur les niveaux de propriétés. Et puis j'ai mis à jour les deux côtés de l'association, et vous avez raison, maintenant j'ai le résultat que je m'attendais. Mais il y a un problème important en définissant les deux côtés de l'association: – Nico
Je n'ai pas défini l'autre côté, j'ai essayé de changer le mappage en plaçant @IndexedEmbedded dans la classe Course sur les niveaux de propriété. Et puis j'ai mis à jour les deux côtés de l'association, et vous avez raison, maintenant j'ai le résultat que je m'attendais. Mais il y a un problème important en définissant les deux côtés de l'association: level.getCourses(). Add (monCours1); myCourse1.getLevels(). add (niveau); entityManager.save (niveau); ==> JPA va charger deux collections (level.courses et myCourse1.levels) ou est-ce que je me trompe sur le chargement de la collection jpa? Merci pour votre aide – Nico