当前位置: 首页 > 面试题库 >

如何在带有注释的休眠模式下以编程方式验证数据库架构?

裴承安
2023-03-14
问题内容

通过调用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;
        }
    });

}
}


 类似资料:
  • 问题内容: 使用注释如何将实体中的字段映射为给定对象,该实体是String的“映射”(哈希表)?该对象带有注释,并且其实例已存储在hibernate数据库中。 我发现了使用简单的键和值来定义地图的语法: 奇怪的是,实体是键,而简单类型是值,像这样: 但是我看不到如何为元素映射的简单键做到这一点,也看不到如何使用注释来做到这一点。 问题答案: 您可以简单地使用 JPA批注 (请注意,JPA批注与Hi

  • 问题内容: 我正在使用hibernate注释,并且想导出数据库模式。 类似于带有hbm xml文件的schemaexporttask。 问题答案: 确实,原始的Hibernate Core 只能处理Hibernate XML映射文件,而不能处理注释。您需要的是Hibernate Tools 附带的工具。 这是一个改编自Java Persistence With Hibernate的用法示例: 也可

  • 我需要密码验证(例如,密码必须包含至少4个字符,最大8和最小1个数字)。我有模型(当然有getters和setters): 在将用户信息保存到数据库期间,我捕捉到ConstraintViolationException,并使用此异常中的信息在注册期间通知用户由于无效长度等原因必须更正哪些字段。 通过验证一切正常,但密码则不行。我将正则表达式从这个模型类中签出,它工作正常,但当我将这个正则表达式放入

  • 问题内容: 可以通过编程方式更改hibernate.jdbc.batch_size吗?我了解hibernate.jdbc.batch_size是应用程序级别的参数,想知道我是否可以将其专门用于某些HQL插入而不能用于其他。我只更改那些HQL插入的代码 总体情况是,在某些情况下,我需要引入批处理插入以使Web应用程序具有高性能,但我不想破坏现在可以正常使用的普通插入。 问题答案: 据我所知,您不能在

  • 我有一个模型,其中有一个@列(nullable=false)注释HiberNate和所有字段有nullable=false,我想以编程方式添加一些新的注释,如@NotNull和@ApiModelProperty(必需=true)-用于招摇过市。 所以,我希望能够从我的应用程序的模型中解析所有字段,获得现有的注释,并在此基础上添加新的注释。这能做到吗? 更新:问题是每次添加一个新字段,如果它不能为空

  • 问题内容: 是否可以在运行时关闭每个类的某些约束/注释?例如,如果我想对一个字段进行检查,那可能吗? 这将使测试更容易查看某个约束是否正确正确触发,因为我可以关闭所有其他约束,而只需检查一个约束即可。 问题答案: 是否可以在运行时关闭每个类的某些约束/注释?例如,如果我想对firstName字段进行@NotNull检查,那可能吗? 不它不是。Bean验证未定义此类功能。Hibernate Vali