6

我是一个 grails 新手(也是一个 groovy 新手),我正在学习一些 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 shell 可以看到所有的控制器、服务和域对象。这是怎么回事?我需要在这里做点别的吗?

我尝试了另一件事:

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

这次我做错了什么?

4

3 回答 3

2

您需要该包,因为可能(但不是一个好主意)在不同的包中有两个同名的域类。

对于第二个会话,它应该是 foo.save(),而不是 foo.save。

我更喜欢控制台,它更容易使用。运行“grails 控制台”,Swing 应用程序将启动。它与常规的 Groovy 控制台有点不同,因为它有一个可用的隐式“ctx”变量,即 Spring 应用程序上下文。您可以使用它通过“ctx.getBean('fooService')”访问服务和其他 Spring bean

于 2010-01-11T06:15:24.410 回答
2

我赞同 Burt 的建议,即使用控制台而不是 shell。关于异常:

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()
}
于 2010-01-11T15:05:52.640 回答
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> 
于 2010-01-11T06:17:48.063 回答