2017-12-22 32 views
2

Grails 외부에서 GORM을 사용하기위한 POC를 만들려고합니다. 나는 groovy-gradle 독립 실행 형 플러그인을 만들었습니다. 나는 official docs을 따라 갔고 은 클래스에서 내 사용자 도메인에 count()이라는 쿼리를 만들었습니다. gradle run 명령을 사용하여 응용 프로그램을 실행하면이 오류를 건너 왔어요 동안 :Grails 외부에서 GORM을 사용하는 중에 세션을 찾을 수 없습니다.

Exception in thread "main" org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:317) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:273) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:230) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:116) 
    at org.grails.orm.hibernate.AbstractHibernateGormStaticApi.count(AbstractHibernateGormStaticApi.groovy:151) 
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.count(GormEntity.groovy:620) 
    at org.grails.datastore.gorm.GormEntity$Trait$Helper$count.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at com.foo.user.User.count(User.groovy) 
    at com.foo.user.User$count.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) 
    at com.foo.utils.EntityInitializerUtils.initializeDomains(EntityInitializerUtils.groovy:45) 
    at com.foo.utils.EntityInitializerUtils.initializeDomains(EntityInitializerUtils.groovy:21) 
    at com.foo.utils.EntityInitializerUtils$initializeDomains.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at com.foo.Application.main(Application.groovy:15) 
Caused by: org.hibernate.HibernateException: No Session found for current thread 
    at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:116) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:688) 
    at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:315) 

나는이 문제를 재현 Github repo을 만들었습니다. 새 트랜잭션 관리자에서 동적 쿼리 호출을 래핑하는 것과 같은 몇 가지 솔루션을 시도했지만이 오류를 해결하기 위해 DB 구성을 수정했습니다. 어리석은 뭔가를 놓쳐 버렸을 것입니다.하지만 아직 이해할 수 없었습니다.

답변

2

코드에서 아무 것도 나타나지 않아서 최대 절전 모드 세션을 시작하지 않으므로 오류가 발생합니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 하나는

User.withNewSession { 
    println User.count() 
} 

당신은 https://github.com/jeffbrown/hibernate-gorm-poc/commit/3b7f747286b3c12367e9ab57007c57a06b493bcc에서 것을 볼 수 있습니다 ... 당신이 명시 적으로 세션을 시작할 수 있습니다.

GORM Data Services를 사용하면 더 많은 관련이없는 이점을 얻을 수 있습니다. https://github.com/jeffbrown/hibernate-gorm-poc/commit/0ba9b609ebbed9d5784d17e759275958b344004f을 참조하십시오.

+0

Thnax Jeff. 그건 내 바보 같았 어. –

+1

전혀 바보가 아닙니다. 당신에게 해결책이 주어서 다행입니다. https://github.com/ankit-agrawal11/hibernate-gorm-poc/pull/1의 PR은 Grails 외부에서 GORM Data Services를 사용하는 것이 얼마나 쉬운지를 보여줍니다. 필자는 명령형'.withNewSession'을 선호합니다. –

+0

예, 동의합니다. 고맙습니다. –