Как проверить схему базы данных программно в, в спящем режиме с аннотациями?

Это кажется этим 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

5
задан Boris Treukhov 19 January 2012 в 16:12
поделиться

1 ответ

В конце концов, при использовании 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;
        }
    });

}
}
4
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: