在sessionFactory初始化之前更改实体模式名称

时间:2014-09-03 08:39:38

标签: java spring hibernate

在从hibernate 3版本迁移到4版本的过程中,我遇到了问题。 我在我的项目中使用spring和hibernate,在启动应用程序期间,有时我想更改实体类的模式。使用3版本的hibernate和spring,我通过覆盖LocalSessionFactortBean类中的postProcessConfiguration方法来实现这一点:

@SuppressWarnings("unchecked")
    @Override
    protected void postProcessAnnotationConfiguration(AnnotationConfiguration config)
    {
        Iterator<Table> it = config.getTableMappings();
        while (it.hasNext())
        {
            Table table = it.next();
            table.setSchema(schemaConfigurator.getSchemaName(table.getSchema()));
        }
    }
这项工作对我来说很完美。但是在hibernate4.LocalSessionFactoryBean类中,所有后期处理方法都被删除了。有些人建议使用ServiceRegistryBuilder类,但是我想在我的会话工厂中使用spring xml配置,而使用ServiceRegistryBuilder类我不知道如何执行此操作。所以可能有人建议解决我的问题。

1 个答案:

答案 0 :(得分:2)

查看源代码有助于找到解决方案。 LocalSessionFactoryBean类具有名为buildSessionFactory的方法(在先前版本中为newSessionFactory)。使用以前版本的Hibernate(3版本),在此方法调用之前处理了一些操作。你可以在官方文档中看到它们

        // Tell Hibernate to eagerly compile the mappings that we registered,
        // for availability of the mapping information in further processing.
        postProcessMappings(config);
        config.buildMappings();

据我所知(可能是我错了)这个buildMapping方法解析指定为映射类或放在packagesToScan中的所有类,并创建所有这些类的Table表示。在此称为postProcessConfiguration方法之后。

对于Hibernate 4版本,我们没有这样的postProcess方法。但我们可以覆盖buildSessionFactory这样的方法:

@Override
protected SessionFactory buildSessionFactory(LocalSessionFactoryBuilder sfb) {
    sfb.buildMappings();
    // For my task we need this
    Iterator<Table> iterator = getConfiguration().getTableMappings();
    while (iterator.hasNext()){
        Table table = iterator.next();
        if(table.getSchema() != null && !table.getSchema().isEmpty()){
            table.setSchema(schemaConfigurator.getSchemaName(table.getSchema()));
        }
    }
    return super.buildSessionFactory(sfb);
}