java - ORM - 是否需要 DDL 脚本?

标签 java hibernate hbm2ddl

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.

不,事实并非如此。

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

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 这样的管理工具。或Flyway来帮助它。

关于java - ORM - 是否需要 DDL 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48108525/

相关文章:

JAVA:BigO 算法 - equalsIgnoreCase 和 CompareTo

java - Spring Data : issue with OneToMany, 子级未正确保存

java - JPA 不向表添加复合约束

HIbernate 架构更新错误

java - 用 Java 编写单元测试文件,无需接口(interface)包装器

ubuntu - java错误导致Aptana无法运行

java - 将目标 sdk 更新到 29 后导入已弃用的警告

java - 如何在露天访问 session 工厂(数据源)?

java - 在 Tomcat 7/8 中部署时,Hibernate 4 不创建表

java - 您是否需要在 Hibernate 表的 @id 列上创建索引