如何以正确的方式更新生产中的Hibernate应用程序?

Mar*_*cel 3 java postgresql hibernate jenkins

我阅读了有关使用hbm2ddl.auto = update讨论,以便自动更新对数据库模式的更改.

该线程来自2008年,我不知道今天使用自动更新模式有多安全.

我们正在使用Hibernate 4.3.11和PostgreSQL在Glassfish上运行一个小型JavaEE.我们计划与Jenkins一起使用.

使用hbm2ddl.auto = update是否有用?或者使用一个简单的替代方案来手动更新/检查更新是否更好?

我知道很难发表一揽子声明.

dog*_*ose 5

您不应该使用hbm2ddl.auto=update更新生产数据库.

几个理由:

  • Hibernate只会INSERT缺少列而不会修改现有列.因此,如果您重命名属性(Client to Customer),Hibernate将创建一个新列Customer,而不会保持Client Client不变.您需要手动"移动"那里的数据并删除孤立列.
  • Hibernate不会删除不再映射列的约束.因此,如果您的客户端列是NOT NULL,那么对该表的任何插入查询现在都将首先失败,因为Hibernate将不再为孤立列提供任何数据(其仍具有NOT NULL约束).
  • Hibernate不会触及现有列的数据类型.因此,如果将属性类型从String更改为Date - Hibernate将列定义保留为varchar.
  • Hibernate不会删除您删除属性的列,导致数据压缩和最坏情况(约束仍然存在)不再有效的应用程序.
  • 如果您在现有列上创建附加的constriants - hibernate将不会创建它们,因为该列之前已存在.(您可能会错过在现有列上添加的生产数据库的重要限制)

因此,自己执行更新更安全.如果你必须考虑hibernate正在做什么和不做什么 - 你最好从头开始自己做.