gpt4 book ai didi

hibernate - 如何在带有注释的 hibernate 中以编程方式验证数据库模式?

转载 作者:行者123 更新时间:2023-12-04 19:22:45 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Validate schema programmatically using hibernate

(2 个回答)


8 个月前关闭。




通过调用 validateSchema 方法,似乎可以使用 org.hibernate.cfg.Configuration 对象以编程方式执行验证。
但是,此方法需要方言和databaseMetadata 对象。
我正在使用 Spring,我可以从 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();

但是,现在我收到以下错误:

org.hibernate.HibernateException:找不到用于配置的本地数据源 - 必须在 LocalSessionFactoryBean 上设置“dataSource”属性

最佳答案

最后,当使用 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;
}
});

}
}

关于hibernate - 如何在带有注释的 hibernate 中以编程方式验证数据库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2327423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com