3

次のコードを使用して、Hibernate Search インデックスを初期化しています。

EntityManager em = ...
FullTextEntityManager fullTextEM = Search.getFullTextEntityManager(em);
fullTextEM.createIndexer().startAndWait();

このコードを実行すると、次の例外が発生します。

ERROR: HSEARCH000058: HSEARCH000116: Unexpected error during MassIndexer operation
org.hibernate.TransientObjectException: cannot lock an unsaved transient instance: com.example.hs.model.Division
at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:75)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:724)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:717)
at org.hibernate.internal.SessionImpl.access$1700(SessionImpl.java:170)
at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2276)
at org.hibernate.search.batchindexing.impl.EntityConsumerLuceneWorkProducer.indexAllQueue(EntityConsumerLuceneWorkProducer.java:130)
at org.hibernate.search.batchindexing.impl.EntityConsumerLuceneWorkProducer.run(EntityConsumerLuceneWorkProducer.java:102)
at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.run(OptionallyWrapInJTATransaction.java:112)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)

この場合、com.example.hs.model.Divisionクラスには@Transientからの戻り値を計算するメソッドの 2 つの注釈がありHashMapます。はHashMap、次のように Hibernate を介して取得されます。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "division_id", referencedColumnName = "id")
@MapKey(name = "language")
@Field(name="name")
@FieldBridge(impl = com.example.hs.search.LanguageDivisionTextBridge.class)
protected Map<Language, DivisionText> getDivisionTextMap() {
    return divisionTextMap;
}

ご覧のとおりFieldBridge、マッピングに役立つカスタムを使用しています。DivisionTextクラスも注釈でマークされ、正常@Indexedに索引付けされています。

ソースの完全なセットは次の場所にあります。

https://github.com/jsvazic/hibernate-search-example

どんな助けでも大歓迎です。

4

1 に答える 1

3

あなたの問題は、@Transient内部の注釈に関連するのではFoo,なくFoo、全体に関連しています。インデックス作成手順内の一部のコードが呼び出されようとしていますSession.lock(foo),が、またはfooを使用してセッションに割り当てられる前に、 はまだ単なるオブジェクトです。here で説明されているように、親オブジェクトのフィールドの注釈にパラメーターを追加すると役立つ場合があります。Session.saveSession.persistcascade=PERSISTfoo

于 2012-04-06T07:41:35.153 に答える