2011-04-26 1 views
0

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

+0

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

+0

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

+0

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

Répondre

0

Avez-vous essayé de placer les annotations régulièrement? Soit tout sur les champs ou tout sur les getters?

+0

J'ai essayé mais il ne semble pas être le problème ... – Nico

+0

J'ai ajouté plus d'explications dans ma question, j'espère que cela aidera, parce que je reconnais que ma question n'était pas très claire. – Nico

+0

!!! Je valide la réponse hardy supérieure: "Définir les deux côtés de la relation est essentiel.Il n'a rien à faire avec la recherche, mais est simplement comportement/exigence Hibernate (JPA) de base." !!! – Nico

Questions connexes