2014-10-11 10 views
7

Kürzlich habe ich eine einfache Grails-Anwendung mit dem Durchsuchbaren Plugin integriert. Was ich gefunden habe, war, dass das durchsuchbare Plugin nicht mit der Hibernate 4 Bibliothek funktioniert.Grails 2.4 + Hibernate 4 + Durchsuchbares plugin = ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl

Hier können Sie eine Beispielanwendung finden, die nur saubere Grails 2.4 App mit nur durchsuchbare Plugin enthält hinzugefügt - https://github.com/wololock/grails-searchable-example

Wenn ich diese App mit laufen:

runtime ":hibernate4:4.3.5.5" 

Abhängigkeit, wird es nicht starten und wirft eine Ausnahme:

ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl 

Was ich bereits gefunden haben, ist, dass in der Hibernate4 SessionFactoryImpl zum org.hibernate.inte bewegt wurde rnal Paket und es scheint, wie Kompass für diese Klasse in der alten Position aussieht:

2014-10-11 19:41:58,142 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener - Error initializing the application: org/hibernate/impl/SessionFactoryImpl 
Message: org/hibernate/impl/SessionFactoryImpl 
Line | Method 
->> 95 | injectLifecycle in org.compass.gps.device.hibernate.lifecycle.DefaultHibernateEntityLifecycleInjector 

Wechsel zurück zum:

runtime ":hibernate:3.6.10.17" 

und

cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' 

in den DataSource.groovy Entschlüssen zu ändern das Problem.

Meine Frage ist: Gibt es eine Problemumgehung, um durchsuchbares Plugin mit Hibernate 4 zu verwenden oder müssen wir warten oder das Problem in Compass/Searchable Quellcode beheben? Wie sind Sie mit diesem Problem in Ihrer Grails-Anwendung umgegangen? Ich werde für Ihre Tipps dankbar sein.

+0

gefunden ist, was blutige CRACKS mich mit Grails ... all diesen fantastischen Plugins, die nie mit den neuesten Versionen von Grails arbeiten, so frustrierend 99% verbringen Zeit für die Suche nach Fixes und Workarounds –

Antwort

10

Es gab mehrere Paket- und Klassennamenänderungen zwischen Hiberate 3.x und 4.x, sodass Code, der mit Hibernate 3.x funktioniert, außer in seltenen Fällen nicht mit 4.x funktioniert. Abgesehen von den Namensänderungen gab es große interne Änderungen in der Funktionsweise der Dinge, so dass Code, der kompiliert wird, nicht unbedingt ausgeführt wird. App Option # 1 ist Downgrade auf Hibernate 3.x. Die Konfigurationseinstellungen dafür sind enthalten und auskommentiert (BuildConfig.groovy, DataSource.groovy), so dass dies eine sehr schnelle Option ist. Offensichtlich keine Option, wenn Sie von einer Funktion abhängig sind, die in 4.x hinzugefügt wurde, und dies verzögert nur das eigentliche Problem, bis Sie Hibernate aktualisieren müssen.

Alle Plugins, die Hibernate 3 verwenden, müssen aktualisiert werden, um Hibernate 4 zu unterstützen, entweder als Ersatz oder ideal zur Unterstützung von Cross-Compile-Tricks oder anderen Partiebibliotheken. Eine Plugin-Option, die davon ausgeht, dass Benutzer schließlich von 3.x upgraden wird, besteht darin, einen 3.x-Zweig zu erstellen und eine neue Hauptversion des Plugins (in der Master-Verzweigung) für Hibernate 4 zu starten und die Änderungen vorzunehmen, damit es in 4 funktioniert. x. Verwenden Sie den 3.x-Zweig, um Sicherheitsupdates und kleinere Probleme zu unterstützen, aber fügen Sie keine neuen Funktionen hinzu. Viele Plugin-Autoren werden wahrscheinlich diesen Weg gehen.

In einigen Fällen ist eine weitere Option sinnvoll - tun Sie nichts. Dies gilt für Durchsuchbar. Durchsuchbar verwendet http://www.compass-project.org/, die effektiv tot ist - ihre letzte Version war vor 4 Jahren. Shay Banon ist jetzt der CTO von http://www.elasticsearch.org/ Ich glaube, dass Shay aufgehört hat, an Compass zu arbeiten, und Elasticsearch gestartet hat, weil es unpraktisch ist, Compass über einen einzelnen Server hinaus zu skalieren. Es ist möglich, den Lucene-Index in einer Datenbank zu speichern, aber während dies Ihnen einen zentralisierten einzelnen Schreiber und einen oder mehrere (mit db-Clustering oder ähnlich) zentralisierte Leser gibt, macht ein optimierter Suchserver mit angepassten Protokollen usw. den Weg mehr Sinn.

Es gibt auch Solr der Konsens scheint zu sein, dass Elasticsearch bevorzugt wird. Das Solr Grails Plugin wurde in 3 Jahren nicht aktualisiert, und die Elasticsearch plugin wurde auch schimmelig, aber vor kurzem übernahm Noam Tenne als Plugin Lead und hat eine Menge toller Arbeit geleistet und er hat in den letzten Monaten mehrere Releases gemacht. Beachten Sie, dass die alten Plugins elasticsearch und elasticsearch-gorm zusammengeführt und aktualisiert wurden, um das neue Plugin elasticsearch zu erstellen.

Eine weitere Option ist die Verwendung des eigenen Hibernate-Produkts Hibernate Search. Es gibt a plugin for that, aber es wurde seit 2012 nicht aktualisiert. Egoistisch ist dies meine persönliche Präferenz für Sie - wählen Sie diese Option, übernehmen Sie das Plugin (vorausgesetzt, positive Antwort oder keine Antwort von den ursprünglichen Autoren) und aktualisieren Sie es mit dem neuesten kompatibel Hibernate 4.x Plugin. Das wäre eine gute Alternative zu Elasticsearch.

Abgesehen davon denke ich, dass Elasticsearch die beste Option ist.

+1

Vielen Dank für die sehr beschreibende Antwort Burt. Ich denke, es wird vielen Menschen helfen, die mit dem gleichen Problem kämpfen, um die beste Lösung zu wählen, die ihren Bedürfnissen entspricht .. –

+0

Um ein Update zu diesem alten hinzuzufügen Aber gute Antwort: Hibernate Search integriert sich jetzt auch in Elasticsearch. Und auch Solr ist auf der Roadmap. Siehe http://in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1/ – Sanne

3

Burt gab eine sehr gute Beschreibung. Danke dafür.

Ich möchte nur einen kurzen Hinweis hinzufügen. Zur Zeit Durchsuchbares Plugin funktioniert nicht mit Hibernate 4.X.X. Versuchen Sie, Ihre Hibernate im Projekt 3.XX herabzustufen (Hibernate: 3.6.10.18)

So benötigen Sie: in DataSource.groovy

Add/uncomment folgendes:

Cache. region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'

und löschen/Kommentar:

cache.region.factory_c lass = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'

in BuildConfig.groovy:

Änderung Abhängigkeit Hibernate ": Ruhezustand: 3.6.10.18"

Es funktioniert auf meinem Rechner mit einem solchen Änderungen.

Ich hoffe, es wird jemandem helfen.

(Ich habe hier die Antwort http://tiku.io/questions/4052527/does-the-searchable-plugin-work-with-grails-2-0-0-i-argue-no