最近我正在将一个简单的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
我已经发现,在hibernate 4 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'
groovy解决了这个问题。
我的问题是:是否有任何变通方法可以将Searchable插件与Hibernate 4一起使用,或者我们必须等待或修复Compass/Searchable源代码中的问题?您是如何在Grails应用程序中处理这个问题的?我将感谢你的提示。
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,或者作为替代,或者理想情况下使用一些交叉编译技巧或另一个3rd方库来支持两者。假设用户最终将从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插件也开始发霉了,但最近Noam Tenne接任了插件负责人,做了很多出色的工作,在过去的几个月里他发布了几个版本。请注意,旧的elasticsearch
和elasticsearch-gorm
插件已合并并更新,以创建新的elasticsearch
插件。
另一种选择是使用Hibernate自己的产品Hibernate Search。有一个插件,但自2012年以来一直没有更新。自私地说,这是我个人对你的偏好-选择这个选项,接管插件(假设原始作者肯定或没有回应),并更新它,使其与最新的Hibernate 4.x插件兼容。这将为我们提供一个替代Elasticsearch的好方法。
除此之外,我认为Elasticsearch是您的最佳选择。
Burt给出了非常好的描述。谢谢你。
我只想补充一点提示。目前,Searchable插件无法与Hibernate 4.X.X一起工作。请尝试将项目中的Hibernate降级为3.X.X(Hibernate:3.6.10.18)
因此,您需要:在DataSource.groovy 中
添加/取消注释以下内容:
cache.region.factory_class='net.sf.ehcache.ehibernate.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