在从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
类我不知道如何执行此操作。所以可能有人建议解决我的问题。
答案 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);
}