Grails 2.1:从自定义Spring配置中设置sessionFactory和dataSource

时间:2012-09-05 14:34:33

标签: spring grails groovy gorm grails-2.0

我在Spring中有一个复杂的,自定义配置的Hibernate设置(包括JPA实体,会话工厂和数据源定义),我想在Grails 2.1.0中使用它。因此,我想向Grails提供我已经拥有的sessionFactorydataSource的引用。所以,我不想(事实上,不能)使用放置在hibernate.cfg.xml中的conf/ - 我也不想使用DataSource.groovy,因为所有复杂的配置已经由我们已经测试过的工作代码处理,并且都是基于Spring的。

所以,我设法让我的自定义Spring配置加载到grails run-app(通过importBeans()中的resources.groovy。)在日志中,我可以看到数据库连接,Spring配置和Hibernate启动就好了,所以在运行时创建了sessionFactorydataSource的bean。 现在,如何配置Grails使用它们而不是尝试创建自己的?

理想情况下,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替换了类的实际名称。)正如我之前所示,实体列表是空的,我看不到设置Hibernate的方法{{ 1}} - 例如

sessionFactory

不起作用。

更新2:

当bean和实体从spring加载但没有被GORM使用或看到时,我能够使用Grails内置的实用程序强制转换实体,并使用sessionFactory = ref('sessionFactory') 配置的新bean:

resources.groovy

现在Grails可以看到实体,但是脚手架不起作用,因为增强域对象似乎缺少GORM方法(.list()等等。)您可能期望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' } } 添加这些方法它会创建所有GrailsHibernateUtil.configureHibernateDomainClasses()类,但要么是静默失败,要么是我遗漏了某些东西(可能没有及早运行?不确定。)任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

您是否通过使用db-reverse-engineer插件尝试了相反的方法?我们在将相当复杂的Spring应用程序迁移到grails(大约90个实体)方面取得了巨大成功。