2017-01-19 21 views
0

非常に基本的なFieldBridgeの実装を動作させることができません。インデックス作成プロセスが@FieldBridge注釈を完全に無視しているように見えます。カスタムFieldBridgeの実装でフィールドを見つけることができません

ここでの実装です:

public class LocalisedInformationBridge implements FieldBridge { 

    @Override 
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { 

     luceneOptions.addFieldToDocument(name + ".test", "test", document); 

    } 
} 

エンティティ@FieldBridge注釈付き:

@OneToMany(mappedBy = "product") 
@MapKey(name = "languageCode") 
@IndexedEmbedded 
@FieldBridge(impl = LocalisedInformationBridge.class) 
private Map<String, LocalisedProductInformation> localisedProductInformation; 

含まれるエンティティ:

@ManyToOne 
@JoinColumn(name="productId") 
@ContainedIn 
private Product product; 

私はlocalisedProductInformation.testフィールドを検索しようとすると、私は例外を取得する:

org.hibernate.search.exception.SearchException:フィールドに localisedProductInformation.test

を見つけることができませんがここで私はデータをインデックス化しています方法は次のとおりです。

FullTextEntityManager fullTextEntityManager = 
     Search.getFullTextEntityManager(entityManager); 
fullTextEntityManager.createIndexer().startAndWait(); 

とき、私奇妙なことがありますsetメソッドのブレークポイントをLocalisedInformationBridgeクラスにすると、デバッガはプログラムの実行を停止しません。私がここで行方不明になっていることは非常に明白ですか?

+0

パスにロードされていますか?メッセージを出力するデフォルトのコンストラクタのような愚かなことをしてください。少なくとも – efekctive

+0

がロードされていることをこの方法で知っているでしょうログにはすべてのエンティティが再インデックスされていると表示され、コンストラクタからメッセージを印刷すると、すべてのエンティティに対してメッセージが表示されます... – fuudge

+0

コンテナは、そのインデックスのためですか? – efekctive

答えて

0

@IndexedEmbeddedをコンテナプロパティ(配列、コレクションまたはマップ)に使用すると、@Fieldアノテーションで定義されたフィールドブリッジがこのプロパティの値の要素に適用されます。 あなたの場合、フィールドブリッジはマップ自体にではなく、マップの値に適用されます。マップが空の場合、フィールドブリッジはまったく適用されません。これはあなたの場合ですか?

この動作はちょっと変わっています(ただし、@IndexedEmbeddedは若干目的が異なります)。しかし、これは少し前に導入されていて、それを修正することで、それに頼っているユーザーの負担が軽減されます。したがって、新しいメジャーバージョンがリリースされるまで、これはそのままの状態になりそうです...

+0

はい、そのようなケースで、IndexedEmbeddedアノテーションを削除したときに、これが正しく動作するようになりました。私は、IndexedEmbeddedアノテーションがContainedIn注釈がリレーションシップのもう一方の側で機能するために必要かどうか、またはそれを単独で使用できるかどうか疑問に思っていますか? – fuudge

+0

@fuudge '@IncludedIn'アノテーションが動作するために' @IndexedEmbedded'アノテーションは必要ありません。自分のフィールドブリッジを使用していると仮定すると、あなたはそれがなければ問題ないはずです。 –

関連する問題