【问题标题】:When and how should SpringData + JPA schema and DB initialization be used?何时以及如何使用 SpringData + JPA 模式和 DB 初始化?
【发布时间】:2021-11-10 22:12:17
【问题描述】:

我正在做一个简单的任务,将一个新表添加到现有的 SQL DB 中,并将其连接到带有 SpringData 的 SpringBoot API。

我通常会从直接定义 DB 表开始,创建 PK 和 FK 等,然后创建代表它的 Java bean,但我对使用 SpringData 初始化功能感到好奇。

我想知道 Spring Data + JPA 模式生成和数据库初始化何时何地有用。有很多关于如何实现它的教程,但我不清楚何时以及为什么。

例如:

  1. 我应该将现有的较低环境 DB(手动编码)转换为自动初始化吗?如果是这样,通过删除现有表并允许 App 执行 DDL?

  2. 在生产环境中是否应该完全依赖此功能?

  3. 生成或初始化是否应该只运行一次?一些教程提到这个过程会持续运行,但是为什么你会选择经常丢失数据呢?

  4. drop-and-create jpa 操作的目的是什么?为什么会 你想丢表吗? UAT 测试数据之类的东西是如何处理的?

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-data


    【解决方案1】:

    我在这些主题上的两分钱:

    1. 大多数人可能会说您不应该依赖自动化数据库创建,因为它是您的应用程序的核心概念,您可能希望接管这项任务,以便了解实际发生的情况。我倾向于同意他们的观点。除非它是 POC 操作系统,而不是生产关键,否则我更愿意自己定义数据库详细信息。
    2. 在我看来没有。
    3. 这在非生产环境中可能没问题。或者关于早期和探索性的发展。绝对不会在生产中。
    4. 在 POC 或早期和探索性开发中,这是可以的。在任何其他情况下,我认为这很有用。测试数据也可能是数据库初始设置的一部分。 Spring 允许您通过定义一个 SQL 脚本在启动时将数据插入数据库来做到这一点。

    在我看来,您不应该在生产环境中依赖此功能。相反,您可能想看看 liquibase 或 flyway(比较 https://dzone.com/articles/flyway-vs-liquibase 的好文章),它们是完全成熟的数据库迁移工具,您甚至可以依赖于生产。

    【讨论】:

      【解决方案2】:

      简而言之,我的看法: 不,不要依赖 Auto DDL。它在开发中可能是一个方便的功能,但绝不应该在生产中使用。请注意,只要您更改实体上的某些内容,它就会更改您的数据库。

      但是,这就是我回答的原因,有可能让休眠将 SQL 写入文件而不是执行它。这使您能够使用该功能,但仍可以控制数据库的更改方式。我经常使用它来生成脚本,然后用作我自己的 liquibase 迁移脚本的蓝图。

      通过这种方式,您可以最初在代码中实现实体并运行应用程序,该应用程序会生成包含新添加实体的 create table 语句的 hibernate sql 文件。现在您不必自己为数据库表编写所有这些列名和类型。

      要实现这一点,请将以下属性添加到您的 application.properties:

      spring.jpa.hibernate.ddl-auto=none
      spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=build/generated_scripts/hibernate_schema.sql
      spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
      

      这将在 build/generated_scripts/hibernate_schema.sql 中的项目文件夹中生成 SQL 脚本

      我知道这不是您所要求的,但我认为这可能是关于如何以更安全的方式使用 Auto DDL 的一个很好的提示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-11
        • 2017-03-28
        • 2015-08-19
        • 2016-12-05
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 2011-12-16
        相关资源
        最近更新 更多