【问题标题】:Clone a Table's definition with Hibernate (hbm2ddl)使用 Hibernate (hbm2ddl) 克隆表的定义
【发布时间】:2010-11-17 09:20:03
【问题描述】:

在我的休眠应用程序中有注释驱动对象:AuditEvent。它非常简单,没有外键关系。我通过将旧条目移动到另一个表 OldAuditEvent 来归档该表中的旧条目,该表是 AuditEvent 表的克隆。

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

我想自动化构建过程,有没有办法告诉 hbb2ddl:“嘿,拿这个实体,把表名改成 X 并重新生成它的 DDL”?

更新: 我能够通过您概述的方法来完成这项工作。唯一的麻烦在于 AnnotationSessionFactoryBean 因为它是一个工厂 bean,而 spring 只会给你它工厂的输出。我创建了 ConfigExposingAnnotationSessionFactoryBean(扩展 AnnotationSessionFactoryBean)来通过静态公开 bean 工厂——有点像 hack,但我想做的只是运行构建时任务。

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(";");
    }
}

【问题讨论】:

    标签: hibernate annotations ddl hbm2ddl


    【解决方案1】:

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

    您需要在构建 SessionFactory 之前动态更改 Hibernate 的 Configuration 对象。我使用的是 Spring,这可以通过覆盖 AnnotationSessionFactoryBeanpostProcessAnnotationConfiguration() 方法来完成;否则,您只需在调用 buildSessionFactory() 之前使用您的 Configuration 对象即可。

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

    然后您可以通过Configuration 对象的generateSchemaCreationScript()generateSchemaUpdateScript() 方法生成DDL 脚本。

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

    【讨论】:

    • 我会试试这个,看看它是否有效!即使是 2 个表,我认为这也是值得的——跨平台构建过程中的手动步骤只会拖累事情并导致意外问题。
    • 祝您实施顺利。上述方法对我有用,尽管我将它用于不同的目的(运行时实体映射操作)。不过,我不得不说,我对 Hibernate 对 DDL 脚本中的列重新排序感到非常恼火——我想保持与源代码注释中相同的顺序。您是否以某种方式解决了这个问题,或者这对您来说不是问题?
    • 我们的开发流程是:带注释的POJO -> DDL。我们总是通过 hibernate 属性名称,所以我们不关心列位置。如果休眠是随机重新排序,这意味着它可能在内部某处使用 HashSet/Map。找到代码将其切换到 TreeSet/Map,您可能会得到一致的排序?
    • * 这会给你排序和一致的顺序,但不是你想要的。您需要在结束过程中应用排序,扫描注释并根据类注释重新排序内部休眠结构。
    • 是的,我对常规属性这样做,这是一个巨大的痛苦 :-) 但是对于关联几乎不可能这样做(不重写 Hibernate 元数据对象的重要部分),所以它们总是排在最后。我已经同意了 :-) 但是当我看到你从 POJO 注释生成 DDL 时,我想我会检查你是否遇到过这个问题,也许可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-06-06
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多