2016-06-12 95 views
0

我正在努力使用Hibernate只是爲了保存Grails中的用戶,沒有別的。我找不到這個例子/教程。在Grails服務中注入Hibernate sessionfactory

我不是在尋找GORM,腳手架等WI我試圖在我的服務中使用sessionFactory來堅持UserEntity

 def sessionFactory 
     def hibSession = sessionFactory.getCurrentSession() 
     UserEntity userEntity = new UserEntity(); 
     userEntity.setEmail("grails") 
     hibSession.save(userEntity); 
     hibSession.flush() 

但它說sessionFactory爲空。

我不清楚如何在我的服務中訪問sessionfactory

請指導。

回答

1

編輯2:創建一個集成測試來驗證sessionFactory是否被正確注入。運行以下命令的Grails:

create-integration-test <package>.MyService

您可能已經刪除了單元測試文件MyServiceSpec.groovy測試/單位目錄,如果它的存在。

實現以下測試:

class MyServiceSpec extends Specification { 

    def myService 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test something"() { 
     when: 
     def u = myService.serviceMethod() 

     then: 
     u != null 

    } 
} 

你還需要改變你的服務方法返回用戶實例,以使測試工作,因爲我做了下面。

運行test-app <package.MyService -integration

這是否測試過?如果沒有,請提供有關您的開發環境的更多信息。

編輯:在這種情況下可能無所謂,但是您的grails版本/開發環境是什麼?在提問時指定它會更好。

首先,你爲什麼不使用GORM?我沒有看到使用grails而沒有使用它的核心功能帶來的許多好處。爲什麼你想用sessionFactory來管理ORM而不是GORM?如果你只是打電話給new UserEntity(email:'grails').save(),GORM也會這樣做。

這將我引向下一點:您還沒有使用Groovy的功能。在Groovy中,您可以像上面那樣使用映射構造函數,也可以使用像這樣的setter方法:user.email = 'grails'.

此外,調用服務方法後,會話將自動刷新,因此您不需要手動刷新它。但是,這隻適用於服務方法是事務性的 - 並且它們是默認的。

我不想阻止你使用Grails,但恕我直言你沒有利用Groovy和Grails的強大工具,而是編寫Java,Spring和Hibernate。您只能使用慣例,如域類,控制器,視圖和服務,我不知道這是否值得。但這是你的選擇,你的方法令我驚訝,至少可以說。其次,這是您的代碼的工作方式:

MyService。常規:

@Transactional 
class MyService { 

    def sessionFactory 

    UserEntity serviceMethod() { 
     def s = sessionFactory.currentSession 
     def u = new UserEntity(email:'grails') 
     s.save(u) 
     //or: 
     //def user = new UserEntity() 
     //user.email = 'grails' 
     //s.save(user) 
     //or do it the Java way like in your code 

     u.id ? u : null     
    } 
} 

sessionFactory需要被聲明爲您服務領域,使彈簧能夠在啓動時命名約定注入它。從你的代碼判斷,你應該對spring和依賴注入做進一步的閱讀。 你可以在the official Spring documentation看看,或者做一步一步首先要了解它,在Tutorialspoint .`

+0

感謝您的詳細回答, 其實我使用GWT在我的Grails框架前端 我去通過GORM,但它使用的方式是自動生成視圖常規頁面等,至少在我發現的教程中,我已經有了GWT視圖,我需要從數據庫發送一些數據,所以我現在試着做休眠。 我用上面的ur代碼,但是它說'sessionFactory'爲null。 請指導我爲什麼我的sessionFactory爲空,我是否需要在其他地方定義它,或者我缺少任何東西.. 謝謝 – junaidp

+0

什麼是您的Grails版本?你如何測試你的服務代碼?我將在我的答案中加入樣本集成測試。在單元測試中,bean不是自動裝配的。 – nst1nctz

+0

你能解決這個問題嗎? – nst1nctz