我在 Spring 中有一个复杂的、自定义配置的 Hibernate 设置(包括 JPA 实体、会话工厂和数据源定义),我想在 Grails 2.1.0 中使用它。正因为如此,我想给 Grails 一个我已经拥有的sessionFactory
和的参考。dataSource
所以,我不想(事实上,不能)使用hibernate.cfg.xml
放置在里面的东西conf/
——我也不想使用DataSource.groovy
,因为所有复杂的配置都已经由我们已经拥有的经过测试和工作的代码处理了,并且都是基于 Spring 的.
所以,我已经设法让我的自定义 Spring 配置加载grails run-app
(通过importBeans()
in resources.groovy
。)在日志中,我可以看到 db 连接、Spring 配置和 Hibernate 启动得很好,所以在运行时sessionFactory
创建dataSource
了. 现在,我如何配置 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 的方法sessionFactory
- 例如
sessionFactory = ref('sessionFactory')
不工作。
更新 2:
从 spring 加载 bean 和实体但 GORM 没有使用或查看,我能够使用 Grails 中内置的实用程序和一个新 bean 强制转换实体,配置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()
在创建所有GrailsHibernateDomainClass
类时添加这些方法,但要么它默默地失败了,或者我错过了一些东西(也许跑得不够早?不确定。)非常感谢任何帮助。