【问题标题】:Creating foreign keys using hibernate使用休眠创建外键
【发布时间】:2013-01-03 10:51:02
【问题描述】:

我在使用 Hibernate 和外键时遇到以下问题:

当我第一次部署我的 Web 应用程序时,Hibernate 配置了以下参数(以及许多其他参数):

  • databasePlatform 设置为“通用”(非引擎特定)方言 org.hibernate.dialect.MySQLDialect
  • hibernate.hbm2ddl.auto 设置为 update

由于默认引擎是MyISAM,Hibernate 逻辑上创建了带有索引的MyISAM 表,忽略了创建外键(因为MyISAM 不支持这样的约束)。

现在我想将每个表迁移到InnoDB,我希望 Hibernate 自动创建缺少的外键。不幸的是,Hibernate 似乎只是在寻找索引:

  • 如果索引存在,Hibernate不会创建对应的外键;
  • 如果我删除索引,Hibernate 将创建索引和外键。

由于我不想删除架构中的每个索引,您是否知道有一种方法可以告诉 Hibernate 即使创建了索引也创建外键?

谢谢。

【问题讨论】:

  • 你不能让 hbm2ddl 从头开始​​重新创建数据库吗?它不是为在生产环境中使用而设计的,所以如果 Hibernate 还没有更新,我不希望它能够做到这一点。
  • 实际上我想轻松转换我的测试环境数据库,以便对生成的数据库进行基准测试和测试。如果一切正常并且基准测试是决定性的,我绝对不会在我的生产环境中使用 hbm2ddl 更新,而是在我的暂存环境中测试足够的 SQL 脚本。

标签: mysql hibernate innodb myisam dialect


【解决方案1】:

我的建议是允许 hibernate 重新创建整个架构,因为这是您的开发数据库。

但是,如果您有很多不想丢失的测试数据,那么我将使用可用的 MySQL 命令创建一个脚本来自动删除所有索引,以便 Hibernate 重新创建它们。您需要的命令是:

show tables;

show index from `table_name`;

drop index `index_name` on `table_name`;

将它们组织成某种形式的程序脚本(shell、python 或您构建的应用程序等),您就可以开始了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多