似乎org.hibernate.cfg.Configuration对象可用于通过调用validateSchema方法以编程方式执行验证。 但是,此方法需要dialect和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();
Howerver,现在我收到以下错误:
org.hibernate.HibernateException:找不到配置的本地DataSource - 必须在LocalSessionFactoryBean上设置'dataSource'属性
答案 0 :(得分:4)
最后,当使用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;
}
});
}
}
答案 1 :(得分:1)
我找到了一个更简单的方法来调用适合我的hibernate映射验证: LocalSessionFactoryBean.validateDatabaseSchema()(它与Dan上面的答案中的代码有效地做同样的事情)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/some-test-context.xml" })
public class TestMapping {
@Autowired
ApplicationContext context;
@Test
public void validateSchema() {
AnnotationSessionFactoryBean factory = (AnnotationSessionFactoryBean)context
.getBean("&mySessionFactory");
factory.validateDatabaseSchema();
}
}