2014-10-11 2 views
7

Недавно я интегрировал простое приложение Grails с плагином для поиска. Я обнаружил, что плагин Searchable не работает с библиотекой Hibernate 4.Grails 2.4 + Hibernate 4 + Searchable plugin = ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl

Здесь вы можете найти пример приложение, которое содержит только чистый 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.inte rnal пакет и, похоже, 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 решает проблема.

Мой вопрос: Есть ли какое-либо обходное решение для использования плагина Searchable с Hibernate 4 или нам нужно подождать или исправить проблему в исходном коде Compass/Searchable? Как вы справились с этой проблемой в своем приложении Grails? Я буду благодарен за ваши советы.

+0

это то, что кровопролитные ТРЕЩИНЫ меня с Grails ... все эти фантастические плагины, которые никогда не работают с последними версиями Grails, так расстраивает приходится тратить 99% время поиска исправлений и обходных решений –

ответ

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 party library. Один вариант плагина, предполагающий, что пользователи в конечном итоге будут обновлены с 3.x, должен создать ветвь 3.x и начать новую серьезную ревизию плагина (в главной ветке) для Hibernate 4 и внести изменения, чтобы заставить его работать в 4. Икс. Используйте ветку 3.x для поддержки обновлений безопасности и очень мелких проблем, но не добавляйте новые функции. Многие авторы плагинов, вероятно, пройдут этот маршрут.

В некоторых случаях другой вариант имеет наибольший смысл - ничего не делайте. Это относится к поисковому запросу. Searchable использует 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 тоже становился заплесневевшим, но в последнее время Ноам Тенне взял на себя роль плагина и проделал большую работу, и за последние несколько месяцев он сделал несколько релизов. Обратите внимание, что старые плагины elasticsearch и elasticsearch-gorm были объединены и обновлены для создания нового плагина elasticsearch.

Еще один вариант - использовать собственный продукт Hibernate, Hibernate Search. Там a plugin for that, но он не обновлялся с 2012 года. Эгоистично это мое личное предпочтение вам - выберите этот вариант, возьмите на себя плагин (предполагая положительный ответ или никакой ответ от оригинальных авторов) и обновите его, чтобы он был совместим с последними Плагин Hibernate 4.x. Это даст нам хорошую альтернативу Elasticsearch.

Запрет на это, я думаю, что Elasticsearch - ваш лучший вариант.

+1

Спасибо за очень описательный ответ Берт. Думаю, это поможет многим людям, которые борются с одной и той же проблемой, выбрать лучшее решение, соответствующее их потребностям. –

+0

Чтобы добавить некоторое обновление к этому старому но хороший ответ: Hibernate Search также интегрируется с Elasticsearch. И Solr также находится в дорожной карте. См. http://in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1/ – Sanne

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

Смежные вопросы