Grails 2.4 + Hibernate 4 + Searchable plugin = ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl

时间:2014-10-11 18:00:19

标签: hibernate grails searchable

最近我将一个简单的Grails应用程序与Searchable插件集成在一起。我发现的是Searchable插件不适用于Hibernate 4库。

在这里,你可以找到一个示例应用程序,它只包含干净的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.internal包中,看起来Compass在旧位置查找此类:

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"

并改变

cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
DataSource.groovy中的

解决了这个问题。

我的问题是:是否有任何解决方法可以在Hibernate 4中使用Searchable插件,或者我们必须等待或解决Compass / Searchable源代码中的问题?您是如何在Grails应用程序中处理该问题的?我将非常感谢你的提示。

2 个答案:

答案 0 :(得分: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个 rd 方库。假设用户最终将从3.x升级的一个插件选项是创建一个3.x分支并为Hibernate 4启动插件的新主要修订版(在主分支中)并进行更改以使其在4中工作。 X。使用3.x分支来支持安全更新和非常小的问题,但不要添加新功能。许多插件作者可能会走这条路。

在某些情况下,另一种选择最有意义 - 不做任何事情。这适用于Searchable。可搜索使用的http://www.compass-project.org/实际上已经死了 - 它的最后一次发布是4年前发布的。 Shay Banon现在是http://www.elasticsearch.org/的首席技术官。我相信Shay停止了Compass并开始使用Elasticsearch,因为将Compass扩展到单个服务器之外是不切实际的。可以将Lucene索引存储在数据库中,但是这确实可以为您提供集中式单个写入器以及一个或多个(具有数据库集群或类似功能)集中式读取器,具有自定义协议的优化搜索服务器,让事情变得更有意义。

还有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 :(得分:3)

伯特给出了非常好的描述。谢谢你。

我只想添加简短的提示。 此时,Searchable插件无法与Hibernate 4.X.X一起使用。尝试将项目中的hibernate降级为3.X.X(休眠:3.6.10.18)

所以你需要: 在DataSource.groovy

添加/取消注释以下内容:

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

并删除/评论:

cache.region.factory_class ='org.hibernate.cache.ehcache.EhCacheRegionFactory'

BuildConfig.groovy中的

将Hibernate依赖项更改为“:hibernate:3.6.10.18”

它可以在我的机器上进行此类更改。

希望它会对某人有所帮助。

(我在这里找到了答案http://tiku.io/questions/4052527/does-the-searchable-plugin-work-with-grails-2-0-0-i-argue-no