2012-04-05 5 views
3

ich den folgenden Code bin mit meinem Hibernate Search Index zu initialisieren:Getting a TransientObjectException wenn mein ersten Index erstellen

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

Nun, wenn ich diesen Code ausführen, erhalte ich die folgende Ausnahme:

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) 

In diesem Fall enthält die Klasse com.example.hs.model.Division zwei Annotationen für Methoden, die einen Rückgabewert von HashMap berechnen. Die HashMap wird über Hibernate abgerufen wie folgt:

@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; 
} 

Wie Sie sehen können, habe ich eine benutzerdefinierte bin mit FieldBridge in der Abbildung zu helfen. Die DivisionText Klasse ist auch mit der @Indexed Annotation markiert und wird erfolgreich indiziert.

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

Jede Hilfe willkommen wäre sehr:

Die vollständigen Quell finden werden.

Antwort

3

Ihr Problem bezieht sich nicht auf die @Transient Annotation in Foo, sondern auf Foo als Ganzes. Einige Codes innerhalb der Indizierung versuchen, Session.lock(foo), aufzurufen, aber zu einem Zeitpunkt, als foo immer noch ein einfaches Objekt ist, bevor sie der Sitzung mit Session.save oder Session.persist zugewiesen wurde. Vielleicht würde es helfen, einen cascade=PERSIST Parameter zu der Annotation auf dem foo Feld in Ihrem übergeordneten Objekt hinzuzufügen, wie here erläutert.

+0

Dank Marko, das hat perfekt funktioniert. –

+0

Ich sprach zu früh. Scheint, dass das Problem immer noch existiert. Ich habe das Ohr eines Hibernate Search-Teams, also hoffe ich, dass sie helfen können. Beispielcode finden Sie unter [https://github.com/jsvazic/hibernate-search-example](https://github.com/jsvazic/hibernate-search-example) –

+0

Nur ein kurzes Update, aber ich habe hat den Beispielcode viel, viel einfacher angepasst. Es scheint, dass das Problem speziell in der Division-Klasse liegt, da DivisionText einwandfrei funktioniert, d. H. Wenn ich die @Indexed-Annotation für Division hinzufüge, schlägt sie fehl. –

Verwandte Themen