【问题标题】:Grails 2.4 + Hibernate 4 + Searchable plugin = ClassNotFoundException: org.hibernate.impl.SessionFactoryImplGrails 2.4 + Hibernate 4 + Searchable plugin = ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl
【发布时间】:2014-12-06 16:42:43
【问题描述】:

最近我正在将一个简单的 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 应用程序中处理这个问题的?我将不胜感激您的提示。

【问题讨论】:

  • 这就是 Grails 让我心碎的地方......所有这些很棒的插件,永远无法与最新版本的 Grails 一起使用,因此不得不花费 99% 的时间寻找修复和解决方法,这令人沮丧跨度>

标签: hibernate grails searchable


【解决方案1】:

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

我只想添加简短的提示。 目前 Searchable 插件不适用于 Hibernate 4.X.X。尝试将项目中的hibernate降级为3.X.X (hibernate: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

【讨论】:

    【解决方案2】:

    在 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 分支来支持安全更新和非常小的问题,但不要添加新功能。很多插件作者可能会走这条路。

    在某些情况下,另一个选项最有意义 - 不做任何事情。这适用于可搜索。 Searchable 使用http://www.compass-project.org/,它实际上已经死了——它的最后一个版本是 4 年前。 Shay Banon 现在是 http://www.elasticsearch.org/ 的 CTO,我相信 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 是您的最佳选择。

    【讨论】:

    • 感谢 Burt 非常详细的回答。我认为这将帮助很多面临同样问题的人选择适合他们需求的最佳解决方案。
    • 为这个旧但很好的答案添加一些更新:Hibernate Search 现在也与 Elasticsearch 集成。 Solr 也在路线图上。见in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1
    猜你喜欢
    • 2013-02-22
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多