2010-01-11 28 views
6

我是一個Grails新手(和一個groovy新手),我正在通過一些grails教程。作爲一名新用戶,grails shell對我來說是一個非常有用的小工具,但我無法弄清楚如何讓它看到我的類和對象。這是我想要的: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 

這次我做錯了什麼?

回答

2

我第二次伯特的建議,使用控制檯,而不是殼。關於異常:

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完美運作。我想知道爲什麼我需要補充一點。網上的例子似乎沒有提到它。 – 2010-01-11 17:29:51

+0

你不需要補充,但我想它可以解決你的問題。通過在一個事務中運行你的代碼,你迫使創建一個hibernate會話(否則它會丟失)。 – 2010-01-11 23:15:57

2

您需要該軟件包,因爲在不同的軟件包中有兩個具有相同名稱的域類是可能的(但不是一個好主意)。

對於第二個會話,它應該是foo.save(),而不是foo.save。

我更喜歡控制檯,它使用起來更容易。運行'grails console',Swing應用程序將啓動。它與普通的Groovy控制檯有點不同,它有一個隱含的'ctx'變量,它是Spring應用程序的上下文。您可以通過「ctx.getBean('fooService')」來訪問服務和其他Spring beans。「

+0

謝謝,很好的建議!附:我還有一個問題,save()會產生一個Hibernate異常。建議? – 2010-01-11 06:23:33

+0

另外,「ctx」似乎也可以在我的shell中使用。也許他們在1.2中添加了它? – 2010-01-11 17:29:10

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

啊,我知道保存是一種方法,但我已經足夠新,不知道我不能調用沒有括號的方法:) 你知道我看到的Hibernate會話異常是怎麼回事現在? – 2010-01-11 06:24:25