【问题标题】:configure properties of LocalSessionFactoryBean in grails在 grails 中配置 LocalSessionFactoryBean 的属性
【发布时间】:2010-01-21 00:14:10
【问题描述】:

我有一个使用 spring 项目现有 Java 域类的 grails 项目,我需要配置 typeDefinitions。在 spring 项目中,可以配置 LocalSessionFactoryBean 的这个属性 - 但是在 grails 项目中如何做到这一点?

【问题讨论】:

    标签: hibernate spring grails


    【解决方案1】:

    LocalSessionFactoryBean 的 Grails 版本是一个子类 org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean。它在 org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport 中注册为 Spring bean

    sessionFactory(ConfigurableLocalSessionFactoryBean) {
       ...
    }
    

    所以你有几个选择。一种是在 resources.groovy 中重新定义 bean,维护 Grails 配置的内容以及您的更改,即

    sessionFactory(MyCustomConfigurableLocalSessionFactoryBean) {
       ...
       typeDefinitions = ...
    }
    

    或者如果可能的话,您可以引用 bean 并在 BootStrap 中对其进行修改:

    class BootStrap {
    
       def sessionFactory
    
       def init = { servletContext ->
          sessionFactory.foo = bar
       }
    
       def destroy = {}
    }
    

    看起来 typeDefinitions 需要尽早配置,而工厂 bean 正在构建 SessionFactory,所以选项 1 可能是您最好的选择。

    【讨论】:

    • 这似乎是实现我想要的正确方法,但我不得不承认我的 grails 知识不如我的 spring 知识 - 所以请你给我一个关于如何“重新定义”的提示resources.groovy 中的 bean,维护 Grails 配置的内容以及您的更改”?
    【解决方案2】:

    另一种选择是使用 spring 的生命周期回调,例如实现一个 BeanPostProcessor

    public class CustomBeanPostProcessor implements BeanPostProcessor {
    
    // simply return the instantiated bean as-is
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean; // we could potentially return any object reference here...
    }
    
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if ("sessionFactory".equals(beanName) && bean instanceof ConfigurableLocalSessionFactoryBean)  {
            ConfigurableLocalSessionFactoryBean sessionFactory = (ConfigurableLocalSessionFactoryBean) bean;
            sessionFactory.setTypeDefinitions(...);
        }
        return bean;
    }
    

    }

    并把它扔到你的 resources.groovy

    customProcessor(CustomBeanPostProcessor)
    

    这样您就不必重新定义已经连接到 GORM 动态查找器等的 sessionFactory bean。

    【讨论】:

    • 不错的建议,问题是 postProcessAfterInitialization 永远不会为名为 sessionFactory 的 bean 或 ConfigurableLocalSessionFactoryBean 的实例调用:-(
    • 您是否将 bean 定义添加到您的 resources.groovy 中?我已经测试了上面的代码并且设置 TypeDefinitions 确实可以这样工作。
    • 我发现为什么这对我的情况不起作用:sessionFactory 无法实例化,因为它在加载映射信息时失败 - 因为它不知道配置的 UserType。所以我需要在sessionFactory实例化之前配置好这些TypeDefinitions
    • 为什么不通过 Hibernate 的 元素或注解来指定类型定义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多