2014-10-11 96 views
7

最近我正在將一個簡單的Grails應用程序與Searchable插件集成在一起。我發現的是,可搜索插件不適用於Hibernate 4庫。Grails 2.4 + Hibernate 4 +可搜索插件= ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl

在這裏你可以找到一個只包含乾淨的Grails只檢索插件2.4應用程序示例應用程序添加 - https://github.com/wololock/grails-searchable-example

當我運行這個程序有:

runtime ":hibernate4:4.3.5.5" 

依賴,它不會啓動並拋出例外:

ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl 

我已經發現的是,在Hibernate4 SessionFactoryImpl被移到了org.hibernate.inte它似乎RNAL包像指南針尋找這個類在原來的位置:

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 

切換回:

runtime ":hibernate:3.6.10.17" 

,並在DataSource.groovy中做出決議改變

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

問題。

我的問題是:是否有任何解決方法使用可搜索插件與Hibernate 4或我們必須等待或解決Compass /可搜索源代碼中的問題?你在Grails應用程序中是如何處理這個問題的?我會很感激你的提示。

+0

答案這是血淋淋的裂紋我的Grails ......所有這些美妙的插件,從來沒有使用Grails的最新版本的工作,所以令人沮喪不得不花費的99%時間尋找修補程序和解決方法 – 2015-09-06 09:26:06

回答

10

在Hiberate 3.x和4.x之間有幾個包和類名稱的變化,所以與Hibernate 3.x一起使用的代碼在4.x下不起作用,除非極少數情況。除了名稱更改之外,事情的工作方式也有很大的內部變化,因此編譯的代碼不一定會運行。應用程序選項#1將降級到Hibernate 3.x.配置設置包含並註釋掉(BuildConfig.groovy,DataSource.groovy),所以這是一個非常快速的選擇。顯然,如果您依賴於4.x中添加的功能,那麼這不是一個選項,並且這隻會延遲真正的問題,直到您必須升級Hibernate。

所有使用Hibernate 3的插件都需要更新以支持Hibernate 4,作爲替換,或者理想地支持使用一些交叉編譯技巧或其他方法。假設用戶最終從3.x升級的一個插件選項是創建一個3.x分支併爲Hibernate 4的插件(在主分支)啓動一個新的主要版本,並進行更改以使其在4中工作。 X。使用3.x分支來支持安全更新和非常小的問題,但不要添加新功能。很多插件作者可能會走這條路。

在某些情況下,另一種選擇最有意義 - 不要做任何事情。這適用於可搜索。可搜索使用http://www.compass-project.org/這實際上已經死了 - 它的最後一個版本是4年前。 Shay Banon現在是http://www.elasticsearch.org/的首席技術官我相信Shay停止了Compass的工作,並開始使用Elasticsearch,因爲將Compass擴展到單個服務器之外是不切實際的。可以將Lucene索引存儲在數據庫中,但是,雖然這樣可以爲您提供集中的單個寫入程序和一個或多個(使用db集羣或類似的)集中式讀取程序,但具有自定義協議的優化搜索服務器等更有意義。

還有Solr共識似乎是Elasticsearch是首選。 Solr Grails插件3年未更新,Elasticsearch plugin也變得模糊不清,但最近Noam Tenne接任插件開發負責人並完成了很多偉大的工作,並且他在過去幾個月裏完成了多次發佈。請注意,舊的elasticsearchelasticsearch-gorm插件已合併並更新爲創建新的elasticsearch插件。

另一種選擇是使用Hibernate自己的產品Hibernate Search。有a plugin for that,但它自2012年以來沒有更新過。自私這是我個人對你的偏好 - 選擇這個選項,接管插件(假設肯定回覆或原作者沒有迴應),並更新它與最新版本兼容Hibernate 4.x插件。這會給我們一個很好的選擇Elasticsearch。

除了這個,我認爲Elasticsearch是你最好的選擇。

+1

感謝您提供非常具有描述性的答案Burt。我認爲這將有助於很多同事解決同樣的問題,以便選擇最適合他們需求的解決方案 – 2014-10-13 05:37:53

+0

若要爲此舊版本添加更新但是很好的答案:Hibernate Search現在也集成了Elasticsearch,並且Solr也在路線圖中。請參閱http://in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1/ – Sanne 2016-06-10 20:05:14

3

Burt給出了很好的描述。謝謝你。

我只是想補充一點小提示。 目前可搜索插件不能與Hibernate 4.X.X一起使用。嘗試降級休眠在項目3.XX(休眠:3.6.10.18)

所以,你需要: 在DataSource.groovy中

添加/取消以下:

緩存。 region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'

和刪除/評論:

cache.region.factory_c姑娘= 'org.hibernate.cache.ehcache.EhCacheRegionFactory'

在BuildConfig.groovy:

變化Hibernate的依賴關係 「:冬眠:3.6.10.18」

它的工作原理在我的機器上用這樣的變化。

希望它對別人有幫助。

(我發現這裏http://tiku.io/questions/4052527/does-the-searchable-plugin-work-with-grails-2-0-0-i-argue-no