在grails中配置LocalSessionFactoryBean的属性

时间:2010-01-21 00:14:10

标签: hibernate spring grails

我使用 spring项目现有Java域类进行grails项目,我需要配置 typeDefinitions 。在spring项目中,可以配置 LocalSessionFactoryBean 的此属性 - 但是如何在grails项目中执行此操作?

2 个答案:

答案 0 :(得分:2)

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可能是你最好的选择。

答案 1 :(得分:1)

另一个选择是使用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动态查找器et.al的sessionFactory bean。