2014-10-11 11 views
7

Recentemente stavo integrando una semplice applicazione Grails con il plug-in ricercabile. Quello che ho trovato è che il plugin ricercabile non funziona con la libreria di Hibernate 4.Grails 2.4 + Hibernate 4 + Plugin ricercabile = ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl

Qui potete trovare un'applicazione di esempio che contiene solo Grails puliti 2.4 app con unico plugin ricercabile aggiunto - https://github.com/wololock/grails-searchable-example

Quando eseguo questa app con:

runtime ":hibernate4:4.3.5.5" 

dipendenza, esso non comincerà e getta un'eccezione:

ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl 

quello che ho trovato già è che nel Hibernate4 SessionFactoryImpl è stato spostato nella org.hibernate.inte pacchetto rnal e sembra che Compass cerca questa classe nella vecchia posizione:

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 

Ritornando al:

runtime ":hibernate:3.6.10.17" 

e cambiando

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

nelle risolve DataSource.groovy il problema.

La mia domanda è: c'è qualche soluzione per utilizzare il plug-in ricercabile con Hibernate 4 o dobbiamo aspettare o risolvere il problema in Compass/Searchable codice sorgente? Come hai affrontato questo problema nella tua applicazione Grails? Sarò grato per i tuoi suggerimenti.

+0

questo è ciò che mi sanguinose fessure con Grails ... tutti questi fantastici plugin, che non lavorano con le ultime versioni di Grails, così frustrante devono spendere il 99% del tempo in cerca di soluzioni e soluzioni alternative –

risposta

10

Ci sono state diverse modifiche al nome del pacchetto e della classe tra Hiberate 3.xe 4.x, quindi il codice che funziona con Hibernate 3.x non funzionerà con 4.x tranne in rari casi. Oltre il nome cambia, ci sono stati grossi cambiamenti interni nel modo in cui funzionano le cose, quindi il codice che compila non verrà necessariamente eseguito. L'opzione n. 1 dell'app è il downgrade a Hibernate 3.x. Le impostazioni di configurazione per questo sono incluse e commentate (BuildConfig.groovy, DataSource.groovy), quindi questa è un'opzione molto veloce. Ovviamente non un'opzione se si dipende da una funzionalità aggiunta in 4.x, e questo solo ritarda il vero problema fino a quando non è necessario aggiornare Hibernate.

Tutti i plug-in che utilizzano Hibernate 3 devono essere aggiornati per supportare Hibernate 4, o come sostituzione, o supportare idealmente entrambi utilizzando alcuni trucchi cross-compilazione o un'altra libreria di parti 3 rd. Un'opzione plug-in che presuppone che gli utenti alla fine eseguano l'aggiornamento da 3.x è creare un ramo 3.x e avviare una nuova revisione principale del plug-in (nel ramo principale) per Hibernate 4 e apportare le modifiche per farlo funzionare in 4. X. Utilizzare il ramo 3.x per supportare gli aggiornamenti di sicurezza e problemi molto minori, ma non aggiungere nuove funzionalità. Molti autori di plugin probabilmente seguiranno questa strada.

In alcuni casi, un'altra opzione ha più senso: non fare nulla. Questo vale per ricercabile. Ricercabile utilizza http://www.compass-project.org/ che è effettivamente morto - la sua ultima versione è stata 4 anni fa. Shay Banon è ora il CTO di http://www.elasticsearch.org/ Credo che Shay abbia smesso di funzionare su Compass e abbia avviato Elasticsearch perché non è pratico scalare Compass oltre un singolo server. È possibile memorizzare l'indice di Lucene in un database, ma mentre questo ti dà un singolo scrittore centralizzato e uno o più (con db clustering o simili) lettori centralizzati, un server di ricerca ottimizzato con protocolli personalizzati, ecc. più senso.

C'è anche Solr il consenso sembra essere che elasticsearch è preferito. Il plug-in Solr Grails non è stato aggiornato in 3 anni, e anche lo Elasticsearch plugin si è ammuffito, ma recentemente Noam Tenne ha preso il posto del plug-in e ha fatto un ottimo lavoro e ha realizzato diversi rilasci negli ultimi mesi. Si noti che i vecchi plug-in elasticsearch e elasticsearch-gorm sono stati uniti e aggiornati per creare il nuovo plug-in elasticsearch.

Un'altra opzione è quella di utilizzare proprio prodotto di Hibernate, Hibernate Search. C'è a plugin for that ma non è stato aggiornato dal 2012. Egoisticamente questa è la mia preferenza personale per te - scegli questa opzione, prendi il plugin (assumendo una risposta affermativa o nessuna risposta dagli autori originali) e aggiornalo per essere compatibile con l'ultima Hibernate 4.x plugin. Questo ci darebbe una buona alternativa a Elasticsearch.

Blocco che, penso elasticsearch è la scelta migliore.

+1

Grazie per la risposta molto descrittiva Burt. Penso che aiuterà molte persone, che hanno difficoltà con lo stesso problema, a scegliere la soluzione migliore adatta alle loro esigenze. –

+0

Per aggiungere qualche aggiornamento a questo vecchio ma buona risposta: Hibernate Search si integra anche con Elasticsearch ora e anche Solr è sulla roadmap. Vedi http://in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1/ – Sanne

3

Burt ha fornito una descrizione molto buona. Grazie per questo.

Voglio solo aggiungere un breve suggerimento. In questo momento il plugin ricercabile non funziona con Hibernate 4.X.X. Prova di declassare il tuo hibernate nel progetto per 3.XX (hibernate: 3.6.10.18)

quindi sarà necessario: in DataSource.groovy

add/decommentare la seguente:

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

e cancellare/commento:

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

in BuildConfig.groovy:

cambiamento Hibernate dipendenza ": ibernazione: 3.6.10.18"

Funziona sulla mia macchina con tale i cambiamenti.

Spero che possa aiutare qualcuno.

(Ho trovato la risposta qui http://tiku.io/questions/4052527/does-the-searchable-plugin-work-with-grails-2-0-0-i-argue-no