0

luceneのインデックス作成に問題があります。1つのインデックス付きエンティティを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(level);

myCourse1(たとえば、ID#10)は適切に作成され、レベルにアタッチされます(レベルは親クラス、コースは子です)。次に、「Course」のインスタンスは適切にインデックス付けされますが、Course用に生成されたインデックスを見ると、値#10の「levels.id」が見つかると思います。しかし、私はそれを見つけられません。CourseでLuceneFilterFactory.classを使用して、1つのレベルIDでコースをフィルタリングするため、この種のインデックスが必要です。

たぶん、@ContainedInと@IndexEmbeddedアノテーションの使用は良くありませんか?あるいは、私が必要なことをするのに完全に間違った方法をしているのかもしれません。

簡単にするために:
私は2つのクラスAとBを持っており、AとBの間にmanyToManyの関連付けがあります。A
は関係のマスターです。AとBにインデックスが付けられます。多対多の関連付けに1つのAオブジェクトを含むBオブジェクトを取得するために、休止状態の検索を使用したいと思います。すべてのBを取得するのではなく、この特定のAを含むBオブジェクトのみを取得します。

これを行う方法 ?

ご協力いただきありがとうございます

4

1 に答える 1

0

注釈を一貫して配置しようとしましたか?すべてがフィールドにあるのか、それともすべてがゲッターにあるのか。

于 2011-04-27T06:17:16.003 に答える