Это кажется этим org.hibernate.cfg. Объект конфигурации может использоваться для выполнения проверки программно путем вызова validateSchema метода. Однако для этого метода нужны диалект и объекты databaseMetadata. Я использую Spring, и я могу овладеть объектом AnnotationSessionFactoryBean от пружинного контекста. До сих пор у меня есть следующий код:
AnnotationSessionFactoryBean factory = null;
factory = (AnnotationSessionFactoryBean) context.getBean("AnnotationSessionFactory");
Configuration configuration = factory.getConfiguration();
//the following line does not work, ConnectionHelper hierarchy is not visible outside the package
ConnectionHelper connectionHelper =
new ManagedConnectionProviderConnectionHelper(factory.getHibernateProperties());
Dialect dialect = Dialect.getDialect(factory.getHibernateProperties());
Connection connection = null;
DatabaseMetadata databaseMetadata = null;
try {
databaseMetadata = new DatabaseMetadata(connection, dialect);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
configuration.validateSchema(dialect, databaseMetadata);
Я на правильном пути? Иерархия ConnectionHelper не видима из пакета, таким образом, я не могу получить объект соединения, что путь, для построения databaseMetadata. Как я могу реализовать это?
Править: Я думаю, что сделал некоторые успехи. Существует класс SchemaValidator. Код теперь похож на это:
AnnotationSessionFactoryBean factory = context.getBean("&AnnotationSessionFactory");
Configuration configuration = factory.getConfiguration();
SchemaValidator validator = new SchemaValidator(configuration);
validator.validate();
Howerver, теперь я получаю следующую ошибку:
org.hibernate. HibernateException: Никакой локальный источник данных, найденный для конфигурации - свойство 'источника данных', не должен быть установлен на LocalSessionFactoryBean
В конце концов, при использовании Spring все не так просто. Мне удалось сделать это, расширив AnnotationSessionFactoryBean следующим образом:
public class SchemaValidatingAnnotationSessionFactoryBean extends
AnnotationSessionFactoryBean {
public void validateDatabaseSchema() throws DataAccessException {
logger.info("Validating database schema for Hibernate SessionFactory");
HibernateTemplate hibernateTemplate = new HibernateTemplate(
getSessionFactory());
hibernateTemplate.setFlushMode(HibernateTemplate.FLUSH_NEVER);
hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection con = session.connection();
Dialect dialect = Dialect.getDialect(getConfiguration()
.getProperties());
DatabaseMetadata metadata = new DatabaseMetadata(con, dialect);
Configuration configuration = getConfiguration();
configuration.validateSchema(dialect, metadata);
return null;
}
});
}
}