我读了discussion about using hbm2ddl.auto=update以便自动更新对数据库架构的更改。
帖子来自 2008 年,我不知道今天使用自动更新模式有多安全。
我们在带有 Hibernate 4.3.11 和 PostgreSQL 的 Glassfish 上运行一个小型 JavaEE。我们计划使用与 Jenkins 的持续集成。
启用 hbm2ddl.auto=update 是否有用?或者使用一种简单的替代方法来手动更新/检查更新是否更好?
我知道很难给出一个笼统的声明。
最佳答案
您不应使用 hbm2ddl.auto=update
来更新生产数据库。
几个原因:
- Hibernate 只会插入缺失的列,而不会修改现有的列。因此,如果您将一个属性(Client 重命名为 Customer),Hibernate 将创建一个新的列Customer,留下Client 未受影响。您将需要手动将数据“移动”到那里并删除孤立列。
- Hibernate 不会删除对不再映射的列的约束。因此,如果您的 Client 列是
NOT NULL
,那么对该表的任何插入查询现在都会首先失败,因为 Hibernate 不会为孤立列提供任何数据(仍然有NOT NULL
约束)。 - Hibernate 不会触及现有列的数据类型。因此,如果您将属性类型从 String 更改为 Date - Hibernate 会将列定义保留为 varchar。
- Hibernate 不会删除您删除了属性的列,这会导致数据污染和最坏的情况(约束仍然存在)导致应用程序不再工作。
- 如果您在现有列上创建额外的约束 - hibernate 将不会创建它们,因为该列之前已经存在。 (您可能会错过在现有列上添加的生产数据库的重要约束)
因此,自行执行更新更安全。如果您必须考虑 hibernate 正在做什么和不做什么 - 您最好从头开始自己做。
关于java - 如何以正确的方式更新生产中的 Hibernate 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32634122/