1

我继承了一个较旧的 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....

代码在强制转换时失败,因为我得到了一个不扩展 SessionFactoryImpl 的 SessionFactoryProxy 实例。

我该如何解决?

4

1 回答 1

0

这是 Grails 2.0 中的新功能,它支持域类重新加载。在 2.0 之前,在 run-app 期间更改域类会导致应用程序重新启动,但是对于新的重新加载代理,这不是必需的。但由于持久性配置可能已更改,Grails 会重新构建SessionFactory. 但是由于 Hibernate 的配置方式,其他类都有对旧类的引用,因此在不知道每个类都有引用的情况下无法替换它。所以使用代理来包含可替换的真实实例,每个人都调用代理上的方法。当它SessionFactory被替换时,它完全是代理内部的,其他用户不知道发生了什么。

这意味着SessionFactory不会是 a SessionFactoryImpl,但接口的重点是抽象出具体的实现类,因此强制转换为您期望的真实类是一种不好的做法。这应该适用于旧版本和当前版本的 Grails:

SessionFactory hibernateSessionFactory = (SessionFactory)sessionFactory;
于 2012-12-13T21:34:29.117 回答