# 数据库版本控制

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com.cn/help/idea/llms.txt).

为确保源代码中的数据模型与关系数据库匹配，保持它们同步是至关重要的。 应对这一挑战有两种常用方法。

## 数据库优先

在这种方法中，数据库优先于数据模型类（POJO 或实体类），后者通过代码生成从数据库架构生成，也称为数据库 [逆向工程](reverse-engineering.html)。 应避免修改生成的类，因为它们随时可能重新生成，并且在源代码中所做的任何更改都会丢失。 不过，这种方法  并不能消除对迁移脚本生成的需求 ，因为它们对于将现有安装升级到最新版本是必要的。

## 源码优先

这是一种相反的方法，这里的数据模型类作为唯一的事实来源。 因此，数据库会因数据模型中的更改而被修改。 更新数据库时，迁移脚本必须表示过时数据库状态和数据模型类当前状态之间的更改，可以是任意格式，例如 Flyway SQL 迁移或 Liquibase 更改日志。

IntelliJ IDEA 提供了便捷的工具，帮助开发者处理这两种场景。 本指南介绍了 IntelliJ IDEA 如何在差异更新脚本生成方面节省大量时间。

> **Tip:**
> 在使用数据库版本控制功能之前， [创建一个数据库连接](connecting-to-a-database.html)

## 支持的数据库迁移工具

IntelliJ IDEA 支持两种常用于 Java 应用程序的流行数据库迁移工具： [Flyway](flyway.html) 和 [Liquibase](liquibase.html)。 两者都有专用的 IntelliJ IDEA 插件。

## 通用微分脚本生成流程

本节介绍迁移脚本生成的基本原理。 有关如何在 Liquibase 和 Flyway 中生成迁移脚本的具体细节，请参阅 [Liquibase](liquibase.html)和 [Flyway](flyway.html)。

要生成差异迁移脚本，请在   数据库  中右键点击数据库连接，然后选择   创建 Liquibase 更新日志  或   创建 Flyway 版本化迁移  。 如果构建文件包含所选持久化技术（Jakarta Persistence、Spring Data JPA 或 Spring Data JDBC）和数据库迁移工具（Flyway 或 Liquibase）的依赖项，并且其相应插件已在 IntelliJ IDEA 中安装并启用，则这些操作可用。

在打开的对话框中，选择源（数据模型的理想状态）和目标（数据模型的旧状态）。

生成的迁移脚本 = 当前状态（源）- 之前状态（目标）。

IntelliJ IDEA 将生成迁移脚本以将目标数据库升级到源状态。

可以在以下源选项中选择：

* DB — 应该在您有一个最新数据库并且希望生成迁移脚本以将另一个数据库更新到相同状态时使用。

* Model — 使用它来生成迁移脚本，表示实体关系模型（实体类）的当前状态与旧（目标）状态之间的差异。

目标可以设置为：

* DB — 具有旧版本模式的目标 DB。

* Snapshot — 如果您在数据模型快照中存储了所需的状态，请使用此选项。 这也可以通过 JPA Buddy 生成。

点击确认以继续。 JPA Buddy 将分析 Source 和 Target 之间的差异，并显示预览对话框，以便对生成的迁移脚本进行微调。 点击 保存 以将新脚本添加到项目中或附加到现有脚本。

[Video](https://www.youtube.com/v/xxzfgSvRsMk)

### 差异迁移脚本生成选项

#### 使用数据库

如果您的源数据库已与您的数据模型同步，那么将一个数据库与另一个数据库或快照进行比较是有意义的。 有两种常用方法可使数据库与实体映射保持一致：

* 使用模式自动生成器（Hibernate 和 EclipseLink 提供了各自的实现）。 请注意，即使 Hibernate 文档也警告不要将这种方式用于原型设计或测试之外的原因。

* 手动在数据库架构上应用实体映射中的更改。 这种方法看起来可能过于繁琐，尤其是在数据模型经常变更的早期开发阶段。

#### 使用数据模型

应用程序使用实体映射来表示数据模型，包括实体类、关联、索引和其他相关元素，并遵循所选持久化技术的原则。 换句话说，它已经包含了有关数据库模式的足够信息。 因此，您的源代码是唯一的真理点，代表了最新的（源）架构。 这就是为什么最好将您的数据模型与数据库/快照进行比较，以生成差异更改日志。

IntelliJ IDEA 会扫描所有持久化对象，将它们与目标数据库或快照进行比较，并生成差异迁移脚本。

当数据模型用作当前架构状态的来源时，它会导致选择持久化单元。

[根据文档](https://jakarta.ee/learn/docs/jakartaee-tutorial/current/persist/persistence-intro/persistence-intro.html#_persistence_units)：持久化单元定义了应用程序中由 EntityManager 实例管理的所有实体类的集合。 这一组实体类表示单个数据存储中的数据。

这实际上意味着，如果您的应用程序使用多个数据存储，则需要分别为每个数据存储生成迁移脚本，指定相应的持久性单元。

#### 使用数据模型快照

IntelliJ IDEA 允许使用数据模型快照作为比较的目标。 有时，获取某个模型状态的数据库是不可行或困难的，例如在将更改合并到某些早期应用版本时。 对于每个版本保留一个数据库转储可能不可行。 IntelliJ IDEA 允许签出所需版本的应用程序，并基于实体映射生成 JSON 快照，从而在生成差异迁移脚本时无需数据库。

Procedure: 生成数据模型快照

1. 打开 [Persistence](persistence-tool-window.html) 工具窗口。

2. 右键点击一个元素并选择  `新建 | 数据模型快照` 。

![data-model-snapshot](https://resources.jetbrains.com.cn/help/img/idea/2026.3/data-model-snapshot.png)

这使您能够捕捉数据模型在某个较早时刻的状态，以便创建一个 diff migration script，描述从那时到现在发生的所有修改。

例如，您在功能分支中工作并修改了模型。 在合并之前，有必要创建一个仅描述此分支更改的差异更新日志。

根据具体配置，可能没有始终与主分支同步的 DB。 当您需要将更改合并到不是主分支的应用程序状态中时，例如发布分支，事情会变得更加复杂。 为每个版本维护数据库转储可能不切实际。 IntelliJ IDEA 提供一个更简单的选择：

1.  检出目标分支（例如 main 或 release）

2.  在该分支中创建模型的快照

3.  请检查功能分支

4.  通过比较模型和您在步骤 2 中创建的快照来生成差异迁移脚本。

只需四个简单步骤，您就能获得一个迁移脚本，该脚本描述当前分支与目标分支之间的更改。

### 预览窗口

Liquibase 的预览窗口如下所示（Flyway 的预览窗口略有不同）：

![changelog-preview](https://resources.jetbrains.com.cn/help/img/idea/2026.3/changelog-preview.png)

某些类型的更改在预览窗口中具有自定义字段。 例如，   添加非空约束  更改允许您将数据库中所有现有的空值替换为指定的值：

![changelog-preview-update-null](https://resources.jetbrains.com.cn/help/img/idea/2026.3/changelog-preview-update-null.jpeg)

每种更改类型根据其危险级别进行颜色编码：绿色表示安全，黄色表示警告，红色表示危险。 安全操作是指那些不会以任何方式导致数据丢失的操作，例如，添加列不会影响现有数据。 标记为 CAUTION 的操作通常是安全的，但需要您的注意：例如，如果列中存在空值，则添加 NOT NULL 约束可能会失败。 危险操作可能会导致数据丢失，例如删除列或修改数据类型。

可以在  `工具 | 数据库版本控制 | 差异变更`  中的 IDE 设置下自定义危险级别：

![diff-changes-preferences](https://resources.jetbrains.com.cn/help/img/idea/2026.3/diff-changes-preferences.png)

您可以配置每种更改类型的位置，或者是在主要位置，或者是在次要位置，或者完全忽略它。 默认情况下，新生成的迁移脚本将排除忽略的更改，但会在预览期间在   已忽略  部分中显示它们，以便可以手动添加回来。 对于 Liquibase，您还可以设置每种变更类型使用的上下文和标签。

#### 合并语句

基本上，重命名模式元素，如表名、列名等，会导致两个语句：

* 删除一个现有值

* 新增一个

但是 JPA Buddy 可以用单个重命名或修改语句替换此类语句。 例如，在重命名列/表/序列或更改列类型后，您将在预览窗口中看到两条语句。 但是，通过选择任何相关语句，您可以将它们合并：

[Video](https://www.youtube.com/v/nhGhcpdqTMs)

合并后，drop 语句可能不再相关。 您可以选择要从迁移脚本中删除的更改。 例如，在重命名 id 列（而不是删除旧值并添加新值）之后，您无需为其添加新的主键。

![无需更改](https://resources.jetbrains.com.cn/help/img/idea/2026.3/unnecessary-changes.jpeg)

## 按实体生成 DDL

IntelliJ IDEA 允许您将实体转换为 DDL 语句。 您可以生成：

* [直接从编辑器生成单个实体的初始化脚本](#generate-ddl-single)。

* [多个实体的初始化脚本](#generate-init-ddl)：基于整个模型或选定的实体创建数据库架构。

* [Differential DDL](#generate-differential-ddl)：根据实体映射将已存在的数据库更新为有效状态。

如果希望避免使用由  `hbm2ddl`  或  `ddl-auto`  属性启用的自动脚本生成功能，此功能很有用。 通过使用此功能，您可以在执行前完全控制 DDL，设置正确的 Java -> DB 类型映射，使用属性转换器和 Hibernate 类型映射字段，生成删除语句等。

Procedure: 为单个实体生成 DDL

IntelliJ IDEA 提供了一个操作，用于为特定实体生成 DDL 语句。

1. 在编辑器中打开您的实体源代码后，点击 ![](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.icons.javaee.newui.persistenceEntity%4014x14.svg)（   显示实体操作  ）位于边距中，并选择   生成 DDL  。 或者将光标放在类名上，按 `Alt+Enter` (Windows), `⌥ ⏎` (macOS), `⌥ ⏎` (IntelliJ IDEA Classic (macOS)), `⌥ ⏎` (macOS System Shortcuts), `Alt+Enter` (XWin), `Alt+Enter` (GNOME), `Alt+Enter` (KDE), `Alt+Enter` (Emacs), `Alt+Enter` (Sublime Text), `⌥ ⏎` (Sublime Text (macOS)), `Alt+Enter` (Visual Studio), `⌥ ⏎` (Visual Studio (macOS)), `Alt+Enter` (NetBeans), `Ctrl+1` (Eclipse), `⌘ 1` (Eclipse (macOS)) 调出上下文操作，然后选择   生成 DDL  。

![按实体生成 DDL](https://resources.jetbrains.com.cn/help/img/idea/2026.3/generate_ddl_by_entity_action.png)

或者，在   项目   工具窗口中，右键点击您的实体类文件并选择  `新建 | 按实体生成 DDL` 。

2. 在打开的   按 <Entity name> 生成 DDL   窗口中，配置保存 DDL 语句的选项：

* 数据库类型 ：选择您希望为其生成 DDL 语句的数据库管理系统。

* 另存为 ：选择如何保存 DDL 语句： 文件 、 草稿文件 、 剪贴板 或 数据库控制台 。

* 目录 ：如果 DDL 语句保存为文件，请选择文件位置。

* 文件名 ：如果 DDL 语句保存为文件，请选择文件名。

* 数据库连接 ：如果 DDL 语句保存为控制台命令，请选择您希望运行此语句的数据库连接。

![按实体生成 DDL 窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/generate_ddl_by_entity_window.png)

3. 预览语句并点击   OK   以保存它。

Procedure: 生成数据库初始化脚本

1. 打开 SQL 文件或 [查询控制台](query-consoles.html)。 在工具栏中，点击 ![](https://resources.jetbrains.com.cn/help/img/idea/2026.3/jpa-model.icons.newui.initLiquibaseChangelog.svg)。

2. 在打开的   初始化 DDL   对话框中，点击   模型   并选择一个持久化单元。

要为特定实体生成 DDL 脚本，请在   范围   下选择   所选实体  。

![按实体生成 DDL 窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/init_ddl_dialog.png)

3. 点击   OK  。 IntelliJ IDEA 将分析 Source 和 Target 之间的差异，并显示   DDL 预览  对话框。

4. 预览 DDL 语句并点击   保存  ，将生成的 DDL 脚本插入到 查询控制台 或 SQL 文件中。

![预览 DDL 窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/init_ddl_statement_preview.png)

Procedure: 生成差异 DDL

差异 DDL 是一套 SQL 命令设置，用于根据实体映射更新现有数据库：创建、修改、删除表、列、约束等。

1. 打开 SQL 文件或 [查询控制台](query-consoles.html)。 在工具栏中，点击 ![](https://resources.jetbrains.com.cn/help/img/idea/2026.3/jpa-model.icons.newui.diffLiquibaseChangelog.svg)。

2. 在打开的   差异 DDL   对话框中，选择源（数据模型的期望状态）和目标（数据模型的旧状态）。

可以在以下源选项中选择：

* 数据库 ：如果已有最新的数据库，并希望生成迁移脚本以将另一个数据库更新到相同状态，则应使用此项。

* 模型 ：使用它来生成迁移脚本，表示实体关系模型（实体类）的当前状态与旧（目标）状态之间的差异。

目标可以设置为：

* 数据库 ：具有较旧架构版本的目标数据库。

* 快照 ：如果您在数据模型快照中存储了所需状态，请使用此选项。 也可以由 IntelliJ IDEA 生成。

![按实体生成 DDL 窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/diff_ddl_dialog.png)

3. 点击   OK  。 IntelliJ IDEA 将分析 Source 和 Target 之间的差异，并显示   DDL 预览  对话框。

![预览 DDL 窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/diff_ddl_preview_dialog.png)

4. 预览 DDL 语句并点击   保存  ，将生成的 DDL 脚本插入到 查询控制台 或 SQL 文件中。

### 自动解决 SchemaManagementException

如果您在应用程序启动时遇到  `SchemaManagementException` ，这意味着您已将  `ddl-auto` 属性设置为  `验证` ，并且 Hibernate 无法将 JPA 实体正确映射到您的数据库表。 IntelliJ IDEA 允许直接从堆栈跟踪生成 DDL，以填补 JPA 实体和数据库之间的差异！

[Video](https://www.youtube.com/v/T3VACEO8sFc)

## SQL 可视化设计器

在某些情况下，拥有 JPA 数据模型的 SQL 脚本很有用，尤其是在您需要快速建立新的数据库时。 JPA Buddy 可以通过 JPA Palette 或 Editor Toolbar 生成各种 SQL 语句。 对于每个语句，都有一个相应的窗口允许您配置该语句：

[Video](https://www.youtube.com/v/61_tr0QovfU)

## Hibernate 6 支持

在 Hibernate 6 之前，通常使用 Hibernate Types 库或  `@Type` /  `@Converter`  注解将非标准 SQL 类型映射到 Java 类型。 Hibernate 6 提供了新的映射注解，可以消除大量 Hibernate 类型和 JPA converters。 目前，IntelliJ IDEA 支持以下新的映射注解：

* `@JdbcType` , `@JdbcTypeCode` & `@JdbcTypeRegistration`

[Video](https://www.youtube.com/v/ocNsqBk9fbQ)

* `@Type` , `@JavaType` & `@JavaTypeRegistration`

[Video](https://www.youtube.com/v/7vGgBHwm_Ck)

* `@TimeZoneStorage` & `@TimeZoneColumn`

## Hibernate Envers 支持

> **Note:**
> 要启用此功能，请将 [相应的依赖项](jpa-buddy.html#dependencies)添加到项目中。

[Hibernate Envers](https://hibernate.org/orm/envers/) 是一个有助于在数据库中进行实体审计的模块。 IntelliJ IDEA 可以生成 Hibernate Envers 的函数／方法正确运行所需的所有表。 这包括带有  `@Audited`  注解的实体的审计表和带有  `@RevisionEntity`  注解的实体的修订表。

安装并启用 [JPA Buddy](jpa-buddy.html) 插件后，还可以生成修订实体。 看看它是如何实际运行的：

[Video](https://www.youtube.com/v/k5OTgQBmSrg)

可以配置 Hibernate Envers 行为的各种切面，例如已审计实体的后缀和前缀。 生成 Liquibase 变更日志或 Flyway 迁移脚本时，可以使用属性文件中的这些设置，也可以在 [IntelliJ IDEA 中的专用设置页面](#hibernate-envers)中配置这些设置。

## 设置

### 自定义类型映射

没有通用方法可以自动将自定义 Java 类型映射到 SQL/Liquibase 类型。 这就是为什么您需要为这些属性手动定义目标类型。 如果您的项目中存在这样的属性，在调用 Liquibase 或 Flyway 脚本生成操作后，JPA Buddy 将显示以下窗口：

![检测到未定义映射](https://resources.jetbrains.com.cn/help/img/idea/2026.3/undefined-mapping-detected.jpeg)

您可以随时从  `工具 | JPA Buddy | 数据库版本控制 | 类型映射` 更改已保存的映射配置。

此外，这在应用程序处理来自不同供应商的数据库时可能会有所帮助。 在这种情况下，您的模式可能对每个数据类型稍有不同。

假设该应用程序需要支持 PostgreSQL 和 MS SQL。 并且您希望在字符串中存储 Unicode 字符。 PostgreSQL 支持 Unicode 字符  `VARCHAR` ，但 MS SQL 有一个单独的数据类型  `NVARCHAR` 。

您可以为每个 DBMS 指定类型映射。 还可以为 JPA Converters 和 Hibernate Types 设置映射：

![映射类型](https://resources.jetbrains.com.cn/help/img/idea/2026.3/type-mappings.png)

#### 转换器

为了简化类型映射，IntelliJ IDEA 引入了与数据库无关的 SQL 类型，这些类型被转换为数据库特定的类型。 例如，对于 Oracle DB，“varchar” 会转换为 “varchar2”，而对于 PostgreSQL 则保留为 “varchar”。

每种与数据库无关的类型都有一项别名设置（例如 "java.sql.Types.VARCHAR" 或 "字符 varying"），在大多数情况下可以互换。 未知类型将按原样使用，不进行任何转换。 查看表格中的全部别名列表：

|  名称  |  别名  |  Liquibase 类  |
| --- | --- | --- |
|   `bigint`   |   `java.sql.Types.BIGINT` 、  `java.math.BigInteger` 、  `java.lang.Long` 、  `integer8` 、  `bigserial` 、  `serial8` 、  `int8`   |   `liquibase.datatype.core.BigIntType`   |
|   `blob`   |   `longblob` 、  `longvarbinary` 、  `java.sql.Types.BLOB` 、  `java.sql.Types.LONGBLOB` 、  `java.sql.Types.LONGVARBINARY` 、  `java.sql.Types.VARBINARY` 、  `java.sql.Types.BINARY` 、  `varbinary` 、  `binary` 、  `image` 、  `tinyblob` 、  `mediumblob`   |   `liquibase.datatype.core.BlobType`   |
|   `boolean`   |   `java.sql.Types.BOOLEAN` 、  `java.lang.Boolean` 、  `bit` 、  `bool`   |   `liquibase.datatype.core.BooleanType`   |
|   `char`   |   `java.sql.Types.CHAR` ，  `bpchar`   |   `liquibase.datatype.core.CharType`   |
|   `clob`   |   `longvarchar` 、  `文本` 、  `longtext` 、  `java.sql.Types.LONGVARCHAR` 、  `java.sql.Types.CLOB` 、  `nclob` 、  `longnvarchar` 、  `ntext` 、  `java.sql.Types.LONGNVARCHAR` 、  `java.sql.Types.NCLOB` 、  `tinytext` 、  `mediumtext`   |   `liquibase.datatype.core.ClobType`   |
|   `货币`   |   `money` ，  `smallmoney`   |   `liquibase.datatype.core.CurrencyType`   |
|   `函数`   |   `liquibase.statement.DatabaseFunction`   |   `liquibase.datatype.core.DatabaseFunctionType`   |
|   `datetime`   |   `java.sql.Types.DATETIME` 、  `java.util.Date` 、  `smalldatetime` 、  `datetime2`   |   `liquibase.datatype.core.LiquibaseDataType`   |
|   `日期`   |   `java.sql.Types.DATE` ，  `java.sql.Date`   |   `liquibase.datatype.core.DateType`   |
|   `decimal`   |   `java.sql.Types.DECIMAL` ，  `java.math.BigDecimal`   |   `liquibase.datatype.core.DecimalType`   |
|   `按两次`   |   `java.sql.Types.DOUBLE` ，  `java.lang.Double`   |   `liquibase.datatype.core.DoubleType`   |
|   `浮点数`   |   `java.sql.Types.FLOAT` 、  `java.lang.Float` 、  `real` 、  `java.sql.Types.REAL`   |   `liquibase.datatype.core.FloatType`   |
|   `int`   |   `整数` 、  `java.sql.Types.INTEGER` 、  `java.lang.Integer` 、  `serial` 、  `int4` 、  `serial4`   |   `liquibase.datatype.core.IntType`   |
|   `mediumint`   |  |   `liquibase.datatype.core.MediumIntType`   |
|   `nchar`   |   `java.sql.Types.NCHAR` ，  `nchar2`   |   `liquibase.datatype.core.NCharType`   |
|   `number`   |   `数值` ，  `java.sql.Types.NUMERIC`   |   `liquibase.datatype.core.NumberType`   |
|   `nvarchar`   |   `java.sql.Types.NVARCHAR` ,  `nvarchar2` ,  `national`   |   `liquibase.datatype.core.NVarcharType`   |
|   `smallint`   |   `java.sql.Types.SMALLINT` ，  `int2`   |   `liquibase.datatype.core.SmallIntType`   |
|   `时间戳`   |   `java.sql.Types.TIMESTAMP` 、  `java.sql.Types.TIMESTAMP_WITH_TIMEZONE` 、  `java.sql.Timestamp` 、  `timestamptz`   |   `liquibase.datatype.core.TimestampType`   |
|   `时间`   |   `java.sql.Types.TIME` ,  `java.sql.Time` ,  `timetz`   |   `liquibase.datatype.core.TimeType`   |
|   `tinyint`   |   `java.sql.Types.TINYINT`   |   `liquibase.datatype.core.TinyIntType`   |
|   `uuid`   |   `uniqueidentifier` ，  `java.util.UUID`   |   `liquibase.datatype.core.UnknownType`   |
|   `varchar`   |   `java.sql.Types.VARCHAR` 、  `java.lang.String` 、  `varchar2` 、  `character varying`   |   `liquibase.datatype.core.VarcharType`   |
|   `xml`   |   `xmltype` ，  `java.sql.Types.SQLXML`   |   `liquibase.datatype.core.XMLType`   |

### Hibernate Envers

![hibernate-envers-settings](https://resources.jetbrains.com.cn/help/img/idea/2026.3/hibernate-envers-settings.png)

Hibernate Envers 提供 [各种自定义选项](https://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/ch15.html#envers-configuration)。 可以在 IDE 设置中指定配置，也可以让 IntelliJ IDEA 自动从  `.properties`  文件中读取现有设置。

### 命名策略

默认情况下，Spring Boot 使用  `SpringPhysicalNamingStrategy`  配置物理命名策略。 此实现生成的所有表名均为小写并使用下划线分隔。 例如，  `电话号码` 实体映射到  `telephone_number` 表。 即使您对实体加了注释  `@Table(name = "TelephoneNumber")` 。 迁移脚本必须使用相同的名称，因此 JPA Buddy 在脚本生成期间也会对所有名称应用物理命名策略。

支持以下策略：

* `SpringPhysicalNamingStrategy` ——默认选项

* `PhysicalNamingStrategyStandardlmpl`

* `CamelCaseToUnderscoresNamingStrategy` （仅适用于 Hibernate 6 及更高版本的项目）

要了解更多关于命名策略的信息，您可以查看我们的 [文章](https://www.jpa-buddy.com/blog/hibernate-naming-strategies-jpa-specification-vs-springboot-opinionation/)。

#### 自定义命名策略

有时，项目中命名策略的默认行为会发生变化。 JPA Buddy 也可以帮助您！ 检测到项目中某个类实现了  `org.hibernate.boot.model.naming.PhysicalNamingStrategy` （或其某个后继者）后，命名策略下拉菜单中会出现一个包含相应类的额外 “custom” 部分。

![custom-naming-strategy.png](https://resources.jetbrains.com.cn/help/img/idea/2026.3/custom-naming-strategy.png)

一旦从下拉菜单中选择此类，IntelliJ IDEA 将在生成迁移脚本时使用此策略。 请注意，IntelliJ IDEA 不会自动更新类的变更，因此如果您修改策略代码，您需要点击   重新加载自定义物理命名策略类   或重新启动 IntelliJ IDEA。

![reload-custom-naming-strategy.png](https://resources.jetbrains.com.cn/help/img/idea/2026.3/reload-custom-naming-strategy.png)

[Video](https://www.youtube.com/v/HdhDFd82E_0)

### 最大标识符

关系数据库管理系统有其自身的限制。 例如，12.1 版本之前的 [OracleDatabase](https://twitter.com/OracleDatabase) 表名限制为 30 字节。 为了避免版本控制脚本出现问题，您可以限制表名称：

![max-db-identifier](https://resources.jetbrains.com.cn/help/img/idea/2026.3/max-db-identifier.png)

此外，您可以定义：

* 是否为关联外键约束创建索引；

* 主键约束名称。

