有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ORM是否需要DDL脚本?

Answer表示不信任生产的hibernate.hbm2ddl.auto设置

我对使用ORM的理解:

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

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

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


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

对于生产,为了安全,是否必须运行DDL脚本


共 (2) 个答案

  1. # 1 楼答案

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

    Running DDL scripts manually breaks the purpose of using ORM tool

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

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

    在任何一个非平凡的项目中,人们都会试图确保他们能够改进数据库,而不会被永久地锁定在遗留模式中,并且难以置信地确保数据保持安全。为此目的而设计的合适的工具会使它变得更容易,而ORM的半成品机制则不然

  2. # 2 楼答案

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

    不,不是

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

    Hibernate现在可以根据类的外观生成DDL,但它没有历史感

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

    您在如何更改列的类型方面也非常有限-如果列的内容不能由数据库自动转换,那么您就倒霉了

    例如,不久前,我们将数据库从以二进制形式存储UUID转换为以VARCHAR形式存储UUID,我们必须手动将它们从二进制转换为十六进制,因为MySQL无法自动完成这一操作——如果您尝试使用Hibernate的auto DDL来完成这一操作,您将被彻底搞糟

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

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

    所以要回答你的问题:

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

    是的我建议您使用像LiquibaseFlyway这样的管理工具来辅助它