Hibernate hbm2ddl.auto update不会删除带有mysql的列

时间:2011-08-16 14:36:55

标签: java mysql hibernate

它添加了新的,但据我所知,它不会丢弃旧的?

当我说旧的实体时,我指的是现在完全删除的实体对象的属性,以前它们存在并用@column注释

我唯一的选择是手动删除列表还是将配置值更改为create?两者都不是特别迷人。

还是其他什么?

2 个答案:

答案 0 :(得分:12)

对于它的价值,永远不要在任何实时/生产数据库上使用hbm2ddl.auto。

是的,“按预期工作”,“更新”不会删除任何未引用的列(可能允许您使用具有未被hibernate应用程序使用的列的“旧”数据库,但是可以由外部应用程序使用)。但是,在某些情况下,例如,如果您更改实体中的数据类型,则hibernate可以删除并重新创建列。这是你永远不应该将它用于任何生产系统的原因之一。

就个人而言,我绝不会相信自动“黑匣子”框架可以处理除严格本地/开发环境之外的任何数据模型的更改。我总是在本地开发环境中设置它,你可以创建drop-drop。一旦开始将您的应用程序推广到中央测试/阶段然后生产,所有数据库更改都由DBA完成:具有良好的老式DDL脚本。对于hibernate(或任何其他ORM /自动化框架)中的潜在错误或意外行为,数据非常有价值。我甚至确保在我的应用程序中配置的数据库用户甚至没有在数据库中创建/删除/更改权限,只是为了防止由于hibernate中的错误配置而发生灾难。

所以,回答你的问题 - 如果你希望hibernate始终保持你的数据库完全反映你的实体,“create-drop”是你唯一的选择。只是不要在除了本地开发数据库之外的任何地方使用它。

答案 1 :(得分:1)

我要查看liquibase,以确保您的数据库与您的数据保持同步。也许有点矫枉过正,但非常值得。