Во время перехода из спящего режима 3 версии в 4 версии я столкнулся с проблемой. Я использую spring и hibernate в своем проекте, и во время запуска моего приложения иногда я хочу изменить схему моих классов объектов. С 3-х версией hibernate и spring я делаю это, переопределяя метод postProcessConfiguration в классе LocalSessionFactortBean следующим образом:
@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
Я не знаю, как это сделать. Может быть, кто-то предложит любое решение моей проблемы.
Посмотрите на исходный код, чтобы найти решение. Класс 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
и создает представление в таблице всех этих классов. После этого postProcessConfiguration
метод 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);
}