ORM - 是否需要 DDL 脚本?

ORM - Are DDL scripts required?

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

我对使用ORM的理解:

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

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

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


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

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

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

Running DDL scripts manually breaks the purpose of using ORM tool

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

此外,您不会 运行 手动进行任何操作。有像 Flyway and Liquibase 这样的数据库 migration/refactoring 产品试图解决数据库模式随时间变化的问题。它们也是独立的产品,因此您无需关心您使用的是 Hibernate 还是其他一些数据访问方法。他们还尝试提供一定程度的事务性,这意味着您可以在某些情况下恢复对架构的更改。

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

Running DDL scripts manually breaks the purpose of using ORM tool.

不,不是。

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

Hibernate 可以根据您类现在的样子生成 DDL,但它没有历史感。

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

您更改列类型的方式也非常有限 - 如果列的内容不能由数据库自动翻译,那您就不走运了。

举个例子,不久前我们将数据库从以二进制形式存储 UUID 转换为以 VARCHAR 形式存储,我们不得不手动将它们从二进制转换为十六进制表示法,因为 MySQL 无法自动完成- 如果您尝试使用 Hibernate 的自动 DDL 来做到这一点,您会被彻底搞砸的。

也没有办法告诉 Hibernate 在何处创建索引 - 您将在每个主键列上获得一个索引,但如果您想要额外的索引,则必须手动添加这些索引。

Hibernate 的 DDL 自动生成非常适合验证您的 类 是否正确映射到您的表,但绝不能使用它来更改您的生产数据库。

所以回答你的问题:

For production, does manual run of DDL scripts mandatory for safety?

是的! 而且我建议您使用 Liquibase or Flyway 等管理工具来帮助它。