2010-01-11 6 views
6

저는 grails 초보자입니다. 그리고 나는 grails 튜토리얼을보고 있습니다. 새로운 사용자로서, grails 쉘은 나를 위해 정말 유용한 도구이지만, 클래스와 객체를 보는 방법을 알아낼 수 없습니다. 여기에 내가 시도하고있는 작업은 다음과 같습니다Grails shell은 도메인 객체를 보지 못합니다.

% grails create-app test 
% cd test 
% grails create-domain-class com.test.TestObj 
% grails shell 
groovy:000> new TestObj() 
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj 

내가 Grails의 쉘은 컨트롤러, 서비스 및 도메인의 모든 개체를 볼 수 있다는 인상이었다. 이게 뭐야? 여기서 다른 것을해야합니까? 내가 잘못

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save 
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj 

를하고있는 중이 야 무엇 :

나는 한 가지를 시도?

편집 : 좋아, 나는 .save 대신 .save()을 사용하여 답변을 보았습니다. 하지만 이건 어때?

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

이번에는 무엇이 잘못 되었습니까?

답변

2

저는 Burt가 쉘 대신 콘솔을 사용하도록 권장합니다. 예외에 대해서는 :

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

가 명시 적으로 트랜잭션이 코드를 실행 시도 할 수 있습니다 :

import com.test.TestObj 

TestObj.withTransaction{ status -> 
    TestObj().save() 
} 
+0

예, withTransaction은 완벽하게 작동합니다. 왜 내가 그것을 추가해야하는지 궁금하다. 온라인 사례는 언급하지 않습니다. –

+0

추가 할 필요는 없지만 문제가 해결 될 것이라고 생각했습니다. 트랜잭션 내에서 코드를 실행하면 최대 절전 모드 세션 생성이 강제로 이루어집니다 (그렇지 않은 경우). –

2

다른 패키지에 같은 이름의 도메인 클래스 두 개를 포함 할 수 있으므로 패키지가 필요합니다.

두 번째 세션의 경우 foo.save가 아닌 foo.save() 여야합니다.

저는 콘솔을 선호합니다. 작업하기가 훨씬 쉽습니다. 'grails console'을 실행하면 스윙 앱이 시작됩니다. 일반적인 Groovy 콘솔과는 조금 다르지만 Spring 애플리케이션 컨텍스트 인 'ctx'변수가 있습니다. 이것을 사용하여 "ctx.getBean ('fooService')"를 통해 서비스 및 기타 Spring Bean에 액세스 할 수 있습니다.

+0

감사합니다, 좋은 조언! 추신 한가지 더 질문이 있습니다. save()는 Hibernate 예외를 생성합니다. 제안? –

+0

또한 "ctx"도 내 셸에서 사용할 수있는 것 같습니다. 아마 그들은 1.2에 그것을 추가 했는가? –

1

import com.test.TestObj 또는 표시된대로 new com.test.TestObj()을 참조해야합니다.

'save'은 Grails가 런타임에 도메인 클래스를 장식하는 적절한 방법이 아니라 동적 방법이라는 점에 유의하십시오.

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save() 
===> com.test.TestObj : 2 
groovy:000> 
+1

Ahh, save가 메소드라는 것을 알았지 만, 나는 괄호없이 메소드를 호출 할 수 없다는 것을 알기에는 그저 새롭다. :) Hibernate 세션 예외가 무엇인지 알고 있니? 지금? –

관련 문제