为什么我会收到Grails SessionFactoryProxy?

时间:2012-12-13 21:05:35

标签: hibernate grails sessionfactory

我继承了旧的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。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是Grails 2.0中的新功能,它支持域类重新加载。在2.0之前,在运行应用程序期间更改域类会导致应用程序重新启动,但是使用新的重新加载代理程序时,这不是必需的。但由于持久性配置可能已更改,Grails将重建SessionFactory。但是由于Hibernate的配置方式,其他类都引用了旧的类,因此如果不知道每个具有引用的类,就无法替换它。因此代理用于包含可替换的实例,并且每个人都在代理上调用方法。当SessionFactory被替换时,它完全在代理内部,而其他用户不知道发生了什么。

这意味着SessionFactory不会是SessionFactoryImpl,但是接口的意思是抽象出具体的实现类,所以将它转换为你期望的真实是不好的做法上课。这应该适用于旧版和当前版本的Grails:

SessionFactory hibernateSessionFactory = (SessionFactory)sessionFactory;