2014-10-11 2 views
7

최근에 나는 간단한 Grails 애플리케이션을 Searchable 플러그인과 통합했다. 내가 찾은 것은 Searchable Plugin이 Hibernate 4 라이브러리에서 작동하지 않는다는 것이다.Grails 2.4 + Hibernate 4 + Searchable plugin = ClassNotFoundException : org.hibernate.impl.SessionFactoryImpl

runtime ":hibernate4:4.3.5.5" 

의존성, 그것은 시작하고 던져 실 거예요 : 나는이 응용 프로그램을 실행하면 https://github.com/wololock/grails-searchable-example

이 - 추가 여기

만 검색 가능한 플러그인 깨끗한 Grails를 2.4 응용 프로그램을 포함하는 샘플 응용 프로그램을 찾을 수 있습니다 예외 :

ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl 

이미 발견 무엇이 Hibernate4 SessionFactoryImpl에 org.hibernate.inte로 이동 한 것입니다

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" 

와 DataSource.groovy에의 결의에

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

을 변경하는 나침반이 이전 위치에서이 클래스를 찾습니다처럼 rnal 패키지와 것 같다 문제.

내 질문에 : Hibernate 4에서 Searchable 플러그인을 사용하는 데 대한 해결 방법이 있습니까? 아니면 Compass/Searchable 소스 코드에서 문제를 기다리거나 해결해야합니까? Grails 애플리케이션에서이 문제를 어떻게 처리 했습니까? 나는 너의 끝을 위해 고맙게 여길 것이다.

+0

답을 찾았습니다 수정 및 해결 방법을 찾고있는 시간 –

답변

10

Hiberate 3.x와 4.x 사이에 몇 가지 패키지와 클래스 이름이 변경되었으므로 Hibernate 3.x에서 작동하는 코드는 드문 경우를 제외하고 4.x에서는 작동하지 않습니다. 이름 변경 외에도 작업 방식에 큰 변화가 있었기 때문에 컴파일 된 코드가 반드시 실행되지는 않습니다. App 옵션 # 1은 Hibernate 3.x로 다운 그레이드하는 것입니다. 그 설정은 포함되어 있고 주석 처리되어 있습니다 (BuildConfig.groovy, DataSource.groovy). 매우 빠른 옵션입니다. 4.x에 추가 된 기능에 의존한다면 분명히 옵션이 아니며, 이것은 Hibernate를 업그레이드해야만 실제 문제를 지연시킬 수 있습니다.

Hibernate 3을 사용하는 모든 플러그인은 Hibernate 4를 대체하기 위해 업데이트해야하며, 일부 크로스 컴파일 트릭이나 다른 3 rd 파티 라이브러리를 사용하는 것이 가장 이상적입니다. 사용자가 결국 3.x에서 업그레이드 할 것으로 가정하는 하나의 플러그인 옵션은 Hibernate 4에 대한 3.x 분기를 만들고 플러그인의 새로운 주요 개정판을 시작하고 변경 사항을 적용하여 4에서 작동하도록하는 것입니다. 엑스. 3.x 분기를 사용하여 보안 업데이트 및 사소한 문제를 지원하지만 새 기능을 추가하지 마십시오. 많은 플러그인 작성자가이 경로를 사용합니다.

어떤 경우에는 또 다른 옵션이 가장 적합합니다. 아무 것도하지 마십시오. Searchable에 적용됩니다. 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 년 이후로 업데이트되지 않았습니다. 이기적으로 내 개인적인 취향입니다.이 옵션을 선택하거나 플러그인을 인계받으며 (원본 작성자의 응답이 확실하지 않거나 응답이없는 경우) 최신 버전과 호환되도록 업데이트하십시오. 최대 절전 모드 4.x 플러그인. 그러면 Elasticsearch에 대한 좋은 대안이 될 것입니다.

나는 Elasticsearch가 최선의 선택이라고 생각합니다.

+1

Burt. 매우 설명적인 답변을 주셔서 감사합니다. 같은 문제로 고생하는 많은 사람들이 자신의 필요에 맞는 최상의 솔루션을 선택하는 데 많은 도움이 될 것이라고 생각합니다. –

+0

이 낡은 업데이트를 추가하려면 하지만 좋은 대답 : Hibernate Search는 현재 Elasticsearch와 통합되어 있으며, Solr도 로드맵에 있습니다. http://in.relation.to/2016/05/24/ElasticsearchintegrationReachesBeta1/ – Sanne

3

버트는 매우 잘 묘사했다. 고마워.

짧은 힌트를 추가하고 싶습니다. 현재 Searchable Plugin은 Hibernate 4.X.X에서 작동하지 않는다. 3.XX에 프로젝트에서 최대 절전 모드를 다운 그레이드하려고합니다 (최대 절전 모드 : 3.6.10.18)

그래서 당신이 필요합니다 : 을 DataSource.groovy에에 다음과 같은 주석

추가/:

캐시를. region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'

및/코멘트 삭제 :

cache.region.factory_c을 "최대 절전 모드 : 3.6.10.18을"

을 그것은 같은 내 컴퓨터에서 작동

변화 의존성에 최대 절전 모드 : BuildConfig.groovy에서

하는 아가씨 = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' 변경.

누군가에게 도움이되기를 바랍니다.

는 (나는 이것이 Grails의 최신 버전에서는 작동하지 Grails는 ...이 모든 환상적인 플러그인, 피 묻은의 틈 날, 그래서 좌절가의 99 %를 낭비 할 필요가 무엇을 여기 http://tiku.io/questions/4052527/does-the-searchable-plugin-work-with-grails-2-0-0-i-argue-no