hibernate - Grails 2.4 + Hibernate 4 + 可搜索插件 = ClassNotFoundException : org. hibernate.impl.SessionFactoryImpl

标签 hibernate grails searchable

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

在这里您可以找到一个示例应用程序,它仅包含干净的 Grails 2.4 应用程序,并且仅添加了 Searchable 插件 - 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 应用程序中处理这个问题的?我将不胜感激您的提示。

最佳答案

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 启动插件的新主要修订版(在 master 分支中)并进行更改以使其在 4 中工作。 X。使用 3.x 分支来支持安全更新和非常小的问题,但不要添加新功能。许多插件作者可能会走这条路。

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

还有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 是您的最佳选择。

关于hibernate - Grails 2.4 + Hibernate 4 + 可搜索插件 = ClassNotFoundException : org. hibernate.impl.SessionFactoryImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317599/

相关文章:

java - View 、DAO、服务和 Controller 的基本 Hibernate 和 Spring MVC 集成

grails - Grails GORM MongoDB插件中是否有类似可搜索的search()方法的类似方法?

Grails可搜索返回域但关系为空

java - 将现有项目复制粘贴到 eclipse 后失败

hibernate - 无法删除或更新父行 : a foreign key constraint fails with Join tables

mysql - 指定不同的主机以使用grails进行读写

grails - 从 View 传递grails选择值到 Controller ?

java - Grails 3.3.2 域类继承问题

unit-testing - Grails:在单元测试期间从服务中的数据模型对象获取IndexOutOfBoundsException

Android:如何将 Activity 声明为主要 Activity 和可搜索 Activity ?