我继承了旧的Grails 1.2应用程序,我正在尝试将其升级到最新的Grails 2.1.2。 Grails中的某些内容已经发生了变化,因为来自resources.groovy的代码曾经起作用:
searchIndexBuilder(SearchIndexBuilder) {bean ->
bean.singleton = true
indexManager = ref("indexManager")
sessionFactory = ref("sessionFactory")
}
结合SearchIndexBuilder.java中的代码:
private void injectHibernateEventListener() {
try {
HibernateEventListener hel = initHibernateEventListener();
SessionFactoryImpl hibernateSessionFactory = (SessionFactoryImpl) sessionFactory; //fails here
EventListeners hibernateEventListeners = hibernateSessionFactory.getEventListeners();
etc....
代码在转换时失败,因为我得到一个SessionFactoryProxy的实例,它不会扩展SessionFactoryImpl。
我该如何解决这个问题?
答案 0 :(得分:0)
这是Grails 2.0中的新功能,它支持域类重新加载。在2.0之前,在运行应用程序期间更改域类会导致应用程序重新启动,但是使用新的重新加载代理程序时,这不是必需的。但由于持久性配置可能已更改,Grails将重建SessionFactory
。但是由于Hibernate的配置方式,其他类都引用了旧的类,因此如果不知道每个具有引用的类,就无法替换它。因此代理用于包含可替换的实例,并且每个人都在代理上调用方法。当SessionFactory
被替换时,它完全在代理内部,而其他用户不知道发生了什么。
这意味着SessionFactory
不会是SessionFactoryImpl
,但是接口的意思是抽象出具体的实现类,所以将它转换为你期望的真实是不好的做法上课。这应该适用于旧版和当前版本的Grails:
SessionFactory hibernateSessionFactory = (SessionFactory)sessionFactory;