代码之家  ›  专栏  ›  技术社区  ›  Justin

使用hibernate(hbm2ddl)克隆表的定义

  •  2
  • Justin  · 技术社区  · 15 年前

    在我的Hibernate应用程序中,有注释驱动的对象: 审计事件 . 它非常简单,没有任何外键关系。我将此表中的旧条目移动到另一个表来存档 奥尔德事件 ,它是 审计事件 表。

    现在,我们使用hbm2ddl(在带注释的数据模型上)为整个应用程序生成DDL,并手动复制/粘贴AuditEvent表并更改其名称以创建 奥尔德事件 .

    我想自动化构建过程,有没有办法告诉hb2ddl:“嘿,拿着这个实体,把表名改成x,然后重新生成它的ddl”?

    更新 : 我能按照你概述的方法来完成这项工作。唯一的问题是AnnotationSessionFactoryBean,因为它是一个工厂bean,而Spring只提供它工厂的输出。我创建了configExposingAnnotationSessionFactoryBean(扩展AnnotationSessionFactoryBean),通过静态(有点像黑客)公开bean工厂,但我只想运行构建时任务。

    Configuration cfg = ConfigExposingAnnotationSessionFactoryBean.s_instance.getConfiguration();
    
    PersistentClass pClass = cfg.getClassMapping("com.myco.LoginAttempt");
    pClass.getTable().setName("ArchiveLoginAttempt");
    
    Dialect dialect = Dialect.getDialect(ConfigExposingAnnotationSessionFactoryBean.s_instance.getHibernateProperties());
    
    // only output create tables, not indexes or FK
    for (String s : cfg.generateSchemaCreationScript( dialect )) {
        if (s.contains("create table") && s.contains("Archive")) {
            m_outstream.print(s);
            m_outstream.println(";");
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   ChssPly76    15 年前

    这是可行的,但相当混乱,很有可能,在这种情况下不值得这样做。

    您需要动态更改Hibernate的 Configuration 生成sessionFactory之前的对象。我你用的是弹簧,这可以通过覆盖 postProcessAnnotationConfiguration() 方法 AnnotationSessionFactoryBean 否则,您只需使用 Configuration 调用前的对象 buildSessionFactory() 关于它。

    您可以通过以下方式访问类/表映射: configuration.getMappings() . 然后您需要通过 getTable() ,通过创建新名称的副本 addTable() 并通过复制所有列/键 Table API .

    然后可以通过以下方式生成DDL脚本: generateSchemaCreationScript() generateSchemaUpdateScript() 方法 配置 对象。

    正如我所说,在这种情况下可能不值得这样做:—)