ORM - 是否需要DDL脚本?

时间:2018-01-05 06:46:43

标签: java hibernate hbm2ddl

Answer说,不要相信hibernate.hbm2ddl.auto生产设置。

我对使用ORM的理解:

1)避免设计&规范化数据库层的数据库模式(比如RDBMS)。在mongoDB世界中,使用ODM。

2)避免在代码中嵌入SQL查询语言(比如说java)。

3)只考虑存储和检索对象(在OOP意义上)

运行DDL脚本会破坏使用ORM工具的目的,看起来类似于JDBC方法,除了它为供应商特定数据库提供SQL方言。

对于生产,可以运行DDL脚本以确保安全吗?

2 个答案:

答案 0 :(得分:3)

  

手动运行DDL脚本会破坏使用ORM工具的目的。

不,它没有。

对象关系映射工具是一种工具,可帮助将表中的数据转换为可在对象编程语言中使用的对象 - 它与数据库管理无关。

Hibernate可以根据你的类现在的内容生成一个DDL ,但它没有历史感。

如果你正在做的只是添加新的列或表,你可能会没事,但是你重命名列的那一刻你运气不好,因为Hibernate会看到旧列而不会找到它的映射所以它将删除它,然后使用新名称创建一个新列。如果你对该列有一个非空的要求你就搞砸了,因为你无法告诉Hibernate默认值是什么(好吧,有一个hack但请不要这样做。)

您在如何更改列类型方面也非常有限 - 如果数据库中的列内容无法自动翻译,那么您运气不佳。

作为一个例子,我们将数据库从存储二进制文件的UUID切换到一段时间后将它存储为VARCHAR,我们不得不手动将它们从二进制转换为十六进制符号,因为MySQL不能自动执行 - 你应该是正确的如果您尝试使用Hibernate的自动DDL,那就搞砸了。

也无法告诉Hibernate创建索引的位置 - 您将获得每个主键列的索引,但如果您需要额外的索引,则必须手动添加这些索引。

Hibernate的DDL自动生成有助于验证您的类是否正确映射到表中,但绝不能用它来更改生产数据库。

所以回答你的问题:

  

对于生产,手动运行DDL脚本是否必须安全?

是的!我建议您使用LiquibaseFlyway等管理工具来帮助它。

答案 1 :(得分:2)

是的,它们是必需的。如果你想高效工作,那就是。

  

手动运行DDL脚本会破坏使用ORM工具的目的

不,不。 ORM代表对象关系映射,意味着它将RDBMS的关系数据映射到对象。它无处可能意味着ORM必须更改数据库模式,即使存在这种可能性(并且在非常简单的情况下也适用)。

除此之外你不会手动运行任何东西。有一些数据库迁移/重构产品,如FlywayLiquibase,它们试图解决数据库模式随时间变化的问题。它们也是单独的产品,因此您无需关心是使用Hibernate还是其他一些数据访问方法。他们还尝试提供一定数量的事务性,这意味着您可以在某些情况下恢复对模式的更改。

在任何非平凡的项目中,人们都会尝试确保他们可以改进数据库而不必永久地锁定在遗留模式中,并且确保数据保持安全。为此目的而设计的适当工具使得它更容易,ORM的半成品机制不会。