Spring 迁移Hibernate3配置-覆盖表映射

Spring 迁移Hibernate3配置-覆盖表映射,spring,migration,hibernate-4.x,hibernate3,Spring,Migration,Hibernate 4.x,Hibernate3,我必须将hibernate3-spring4配置迁移到hibernate5(或至少4)。关于“有人还在使用hibernate3吗?” 迁移涉及替换spring的AnnotationSessionFactoryBean,hibernate4/5不支持它。我尝试使用LocalSessionFactoryBean,但该类不允许指定自定义hibernate配置对象 我尝试实现的总体目标是基于表名动态设置数据库模式。架构名称不是固定的,仅在启动时解析 实现了使用一个sessionFactory读/写两个单

我必须将hibernate3-spring4配置迁移到hibernate5(或至少4)。关于“有人还在使用hibernate3吗?”

迁移涉及替换spring的AnnotationSessionFactoryBean,hibernate4/5不支持它。我尝试使用LocalSessionFactoryBean,但该类不允许指定自定义hibernate配置对象

我尝试实现的总体目标是基于表名动态设置数据库模式。架构名称不是固定的,仅在启动时解析

实现了使用一个sessionFactory读/写两个单独的模式,以便在写入两个模式时能够使用单个事务。如果有更好的替代方案来实现这一点,我欢迎其他想法

关于如何将以下代码迁移到hibernate4/5有什么想法吗

@Bean
public AnnotationSessionFactoryBean sessionFactory() throws PropertyVetoException {
    AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean() {
        @Override
        protected org.hibernate.cfg.Configuration newConfiguration() throws HibernateException {
            return new TableSchemaAddingConfig();
        }
    };
    sessionFactory.setDataSource(dataSource);
    ...
    return sessionFactory;
}

class TableSchemaAddingConfig extends org.hibernate.cfg.Configuration {
    @Override
    public Mappings createMappings() {
        return new MappingsImpl() {
            @Override
            public Table addTable(String schema, String catalog, String name, String subselect, boolean isAbstract) {
                schema = getSchema(name);
                return super.addTable(schema, catalog, name, subselect, isAbstract);
            }

            @Override
            public void addTableBinding(String schema, String catalog, String logicalName, String physicalName, Table denormalizedSuperTable) throws DuplicateMappingException {
                schema = getSchema(physicalName);
                super.addTableBinding(schema, catalog, logicalName, physicalName, denormalizedSuperTable);
            }
        };
    }

    private String getSchema(String name) {
        if (StringUtils.startsWithIgnoreCase(name, "FOO_") ||
                StringUtils.startsWithIgnoreCase(name, "BAR_")) {
            return foo_schema; // value based on external configuration settings, not known at compile time
        } else {
            return bar_schema; // value based on external configuration settings, not known at compile time
        }
    }
}

你能做到这一点吗?