2012-09-05 60 views
6

我在Spring Grails 2.1中使用了Spring(包括JPA實體,會話工廠和數據源定義)中複雜的,自定義配置的Hibernate設置0.0。因此,我想給Grails一個參考,我已經有sessionFactorydataSource。因此,我不希望(實際上也不能)使用放置在conf/中的hibernate.cfg.xml - 我也不想使用DataSource.groovy,因爲所有複雜的配置已經由我們已經擁有的經過測試和可用的代碼進行處理,並且都是基於Spring的。因此,我設法通過grails run-app(通過importBeans(),resources.groovy)加載我的自定義Spring配置。在日誌中,我可以看到db連接,Spring配置和Hibernate啓動得很好,所以在運行時豆到sessionFactorydataSource被創建。 現在,我如何配置Grails來使用它們,而不是嘗試創建它自己的?Grails 2.1:設置自定義Spring配置中的sessionFactory和dataSource

理想情況下dataSource = ref('myDataSource')的某個地方會很棒 - 和sessionFactory = ref('sessionFactory')或類似的地方一樣。我見過一些人將它放在resources.groovy中,但它不起作用。

我已經看到了這個太:

eventDao(com.JavaClassRequiringDataSource) { dataSource = ref('dataSource') } 

,但它不工作,要麼

任何幫助,將大大讚賞...我已經花了(不知道是否做過。) 10個小時試圖讓這個工作無濟於事。如果我失去了一些Grails功能,只要它有效,我不介意。目前的目標是讓GORM看到我們已經擁有的(〜200個)實體並做一些腳手架:)

我也知道Grails沒有看到這些實體,因爲我已經將以下內容添加到BootStrap.groovy中:

// ... 
def grailsApplication 
def init = { servletContext -> 
    println grailsApplication.domainClasses 
} 
// ... 

並打印[]。

如果需要修補程序,只要給我一個從哪裏開始的一般概念,然後我會看看...我只想讓這個工作。

謝謝!

更新1:

我已經試過resources.groovy文件的幾個咒語,目前它看起來像這樣:

beans = { 
    importBeans('main-spring-file-for-the-rest.xml') 
    dataSource = ref('dataSource') 
} 

但試圖腳手架時,我仍然得到:

Error 2012-09-06 00:02:00,768 [Thread-9] ERROR plugins.DefaultGrailsPlugin - Cannot generate controller logic for scaffolded class x.y.z.Class. It is not a domain class! 

(登錄編輯的行:與x.y.z.Class取代的類的實際名稱。)正如我所示befor即,實體的列表是空的,我看不出有任何設置休眠sessionFactory的方式 - 例如

sessionFactory = ref('sessionFactory') 

不工作。

更新2:

隨着豆類和彈簧加載實體,但不使用或GORM看到,我能夠強制使用內置到Grails的一個實用工具和新豆的實體的轉換從resources.groovy正是如此配置:

public class TestFix implements ApplicationContextAware { 
    SessionFactory sessionFactory 
    ApplicationContext applicationContext 
    GrailsApplication grailsApplication 

    def init() { 
     GrailsHibernateUtil.configureHibernateDomainClasses(sessionFactory, "sessionFactory", grailsApplication) 

    } 
} 

beans = { 
    importBeans('main-spring-file-for-the-rest.xml') 

    myBean(TestFix) { bean -> 
     sessionFactory = ref('sessionFactory') 
     grailsApplication = ref(GrailsApplication.APPLICATION_ID) 
     bean.initMethod = 'init' 
    } 
} 

現在的實體由Grails的觀察,但腳手架不起作用,因爲增強域對象似乎缺乏GORM方法(.LIST()和等。)你會想到GrailsHibernateUtil.configureHibernateDomainClasses()在crea時添加這些方法測試所有的GrailsHibernateDomainClass類,但是無論是默默地失敗還是我錯過了某些東西(可能運行不夠早?不知道。)任何幫助非常讚賞。

+1

我正在閱讀源代碼,但我不確定此功能是否暴露。試着在這裏尋找數據源:https://github.com/grails/grails-core/blob/master/grails-plugin-datasource/src/main/groovy/org/codehaus/groovy/grails/plugins/datasource/ DataSourceGrailsPlugin.groovy#L55 這裏是sessionFactory:https://github.com/grails/grails-core/blob/master/grails-hibernate/src/main/groovy/org/codehaus/groovy/grails/plugins /orm/hibernate/HibernatePluginSupport.groovy – Raphael

+0

你可以發佈你的resources.groovy嗎?我有一個自定義的數據源定義,並且在這裏工作得很好。 –

+0

以該信息更新。感謝您的評論,我也會查看源代碼。 –

回答

1

您是否嘗試過使用db-reverse-engineer插件的其他方法?我們在將相當複雜的Spring應用程序遷移到Grails(大約90個實體)方面取得了巨大成功。

+0

我們不想將我們的模型實體遷移到gorm。根據我們已有的Hibernate配置,我們還有其他幾個項目,這些項目已經過測試並且運行良好。我們絕對不希望每次改變時重複自己,我們的主要應用程序也不是用Grails或Groovy編寫的。 –

相關問題