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

使用Hibernate(hbm2ddl)复制表的定义

司徒锐进
2023-03-14
问题内容

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

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

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

更新
:我能够通过您概述的方法使此工作正常。唯一的麻烦是因为AnnotationSessionFactoryBean是工厂bean,而spring只会给您工厂的输出。我创建了ConfigExposedAnnotationSessionFactoryBean(扩展了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(";");
    }
}

问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 我让hbm2ddl为我创建表(出于开发目的),并且列与类中字段的顺序相反。 如何使其以与类相同的顺序创建列? 我认为Java类不存储字段的顺序,因此Hibernate根本不知道源顺序是什么(如果考虑更复杂的情况,这似乎是合乎逻辑的)。 但是,我至少可以要求Hibernate将PK和FK列作为第一列吗? Hibernate 4.0.0(JBoss AS 7.1.2)MySQL 5.1.x

  • 问题内容: 在我的hibernate-4实体中,我正在使用建议的jadira usertypes 映射一个joda-time DateTime属性: 我的数据库是MySQL。将hibernate属性设置为value时,我在表中生成了以下列: 生成的包含DATETIME列。MySQL中的DATETIME仅具有秒精度,没有小数部分。为了启用小数部分(最高微秒),MySQL 5.6.4和更高版本启用 列

  • 我使用Hibernatehbm2ddl从实体类生成db模式脚本。它工作得很好,但是每一行都没有分号,这使得我不得不手动添加它们。有什么方法可以把我从这个愚蠢的工作中拯救出来吗?

  • 我有一个列表,其中包含以下元素: 和另一个对象,比如: 我有Element1的列表,并希望从Element1创建Elements2: 我正在寻找以更简单的方式执行此操作,也许使用 stream()。实现这一目标的最干净方法是什么?

  • 我有一个实体用户: 和实体课程 我需要制作 user1 课程的副本(深度副本),并将此副本添加到另一个用户 2。最后,我需要用户1有课程,用户2有课程的副本。

  • 主要内容:总结对于任意一个非空 广义表来说,都是由两部分组成:表头和表尾。反之,只要确定的一个广义表的表头和表尾,那么这个广义表就可以唯一确定下来。 复制一个广义表,也是不断的复制表头和表尾的过程。如果表头或者表尾同样是一个广义表,依旧复制其表头和表尾。 所以,复制广义表的过程,其实就是不断的递归,复制广义表中表头和表尾的过程。 递归的出口有两个: 如果当前遍历的数据元素为空表,则直接返回空表。 如果当前遍历的