Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 73 additions & 37 deletions develop/dev-guide-sample-application-java-hibernate.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ summary: 学习如何使用 Hibernate 连接 TiDB。本教程提供了可与 TiD

# 使用 Hibernate 连接 TiDB

TiDB 是一个兼容 MySQL 的数据库,[Hibernate](https://hibernate.org/orm/) 是一个流行的开源 Java ORM。从 `6.0.0.Beta2` 版本开始,Hibernate 支持 TiDB 方言,能够很好地适配 TiDB 的特性
TiDB 是一个 MySQL 兼容的数据库,[Hibernate](https://hibernate.org/orm/) 是流行的开源 Java ORM。由于 TiDB 与 MySQL 高度兼容,建议你将 `org.hibernate.dialect.MySQLDialect` 作为 Hibernate 的 dialect,以获得长期兼容性。或者,你也可以使用 TiDB 专用的 dialect(`org.hibernate.community.dialect.TiDBDialect`),该 dialect 可在 [Hibernate community dialects](https://github.com/hibernate/hibernate-orm/tree/main/hibernate-community-dialects) 中找到,但并非由 PingCAP 维护。如果你在使用 `MySQLDialect` 时遇到任何兼容性问题,可以在 GitHub 上提交 [issue](https://github.com/pingcap/tidb/issues)

在本教程中,你可以学习如何使用 TiDB 和 Hibernate 完成以下任务:

- 搭建你的环境。
- 使用 Hibernate 连接到你的 TiDB 集群。
- 构建并运行你的应用程序。你还可以在 [示例代码片段](#sample-code-snippets) 中找到基本 CRUD 操作的示例代码。

> **Note:**
> **注意:**
>
> 本教程适用于 {{{ .starter }}}, {{{ .essential }}}, TiDB Cloud Dedicated TiDB 自建版
> 本教程适用于 TiDB Cloud Starter、TiDB Cloud Essential、TiDB Cloud Dedicated 以及自建 TiDB。

## 前置条件
## 前提条件

完成本教程,你需要:

Expand All @@ -30,24 +30,24 @@ TiDB 是一个兼容 MySQL 的数据库,[Hibernate](https://hibernate.org/orm/

**如果你还没有 TiDB 集群,可以按如下方式创建:**

- (推荐)参考[创建 {{{ .starter }}} 集群](/develop/dev-guide-build-cluster-in-cloud.md) 创建你自己的 TiDB Cloud 集群。
- 参考[部署本地测试 TiDB 集群](/quick-start-with-tidb.md#deploy-a-local-test-cluster) 或[部署生产环境 TiDB 集群](/production-deployment-using-tiup.md) 创建本地集群。
- (推荐)参照 [创建 TiDB Cloud Starter 集群](/develop/dev-guide-build-cluster-in-cloud.md) 创建属于你自己的 TiDB Cloud 集群。
- 参照 [部署本地测试 TiDB 集群](/quick-start-with-tidb.md#deploy-a-local-test-cluster) 或 [部署生产环境 TiDB 集群](/production-deployment-using-tiup.md) 创建本地集群。

</CustomContent>
<CustomContent platform="tidb-cloud">

**如果你还没有 TiDB 集群,可以按如下方式创建:**

- (推荐)参考[创建 {{{ .starter }}} 集群](/develop/dev-guide-build-cluster-in-cloud.md) 创建你自己的 TiDB Cloud 集群。
- 参考[部署本地测试 TiDB 集群](https://docs.pingcap.com/tidb/stable/quick-start-with-tidb#deploy-a-local-test-cluster) 或[部署生产环境 TiDB 集群](https://docs.pingcap.com/tidb/stable/production-deployment-using-tiup) 创建本地集群。
- (推荐)参照 [创建 TiDB Cloud Starter 集群](/develop/dev-guide-build-cluster-in-cloud.md) 创建属于你自己的 TiDB Cloud 集群。
- 参照 [部署本地测试 TiDB 集群](https://docs.pingcap.com/tidb/stable/quick-start-with-tidb#deploy-a-local-test-cluster) 或 [部署生产环境 TiDB 集群](https://docs.pingcap.com/tidb/stable/production-deployment-using-tiup) 创建本地集群。

</CustomContent>

## 运行示例应用连接 TiDB

本节演示如何运行示例应用代码并连接到 TiDB。
本节演示如何运行示例应用代码并连接 TiDB。

### 第 1 步:克隆示例应用仓库
### 步骤 1:克隆示例应用仓库

在终端窗口中运行以下命令,克隆示例代码仓库:

Expand All @@ -56,33 +56,33 @@ git clone https://github.com/tidb-samples/tidb-java-hibernate-quickstart.git
cd tidb-java-hibernate-quickstart
```

### 第 2 步:配置连接信息
### 步骤 2:配置连接信息

根据你选择的 TiDB 部署方式,连接到你的 TiDB 集群。

<SimpleTab>
<div label="{{{ .starter }}} or Essential">
<div label="TiDB Cloud Starter 或 Essential">

1. 进入 [**Clusters**](https://tidbcloud.com/console/clusters) 页面,然后点击目标集群名称进入其概览页面
1. 进入 [**Clusters**](https://tidbcloud.com/console/clusters) 页面,然后点击目标集群名称,进入其概览页面

2. 点击右上角的 **Connect**,弹出连接对话框。

3. 确保连接对话框中的配置与你的操作环境一致
3. 确保连接对话框中的配置与你的运行环境一致

- **Connection Type** 设置为 `Public`
- **Branch** 设置为 `main`
- **Connect With** 设置为 `General`
- **Operating System** 与你的环境一致

> **Tip:**
> **提示:**
>
> 如果你的程序运行在 Windows Subsystem for Linux (WSL) 中,请切换到对应的 Linux 发行版。

4. 点击 **Generate Password** 生成一个随机密码
4. 点击 **Generate Password** 生成随机密码

> **Tip:**
> **提示:**
>
> 如果你之前已经创建过密码,可以继续使用原密码,或者点击 **Reset Password** 生成新密码。
> 如果你之前已创建过密码,可以继续使用原密码,或点击 **Reset Password** 生成新密码。

5. 运行以下命令,复制 `env.sh.example` 并重命名为 `env.sh`:

Expand All @@ -101,24 +101,24 @@ cd tidb-java-hibernate-quickstart
export USE_SSL='true'
```

请务必将 `{}` 占位符替换为连接对话框中获取的连接参数
请务必将 `{}` 占位符替换为连接对话框中获得的连接参数

{{{ .starter }}} 需要安全连接,因此你需要将 `USE_SSL` 的值设置为 `true`。
TiDB Cloud Starter 需要安全连接,因此你需要将 `USE_SSL` 的值设置为 `true`。

7. 保存 `env.sh` 文件。

</div>
<div label="TiDB Cloud Dedicated">

1. 进入 [**Clusters**](https://tidbcloud.com/console/clusters) 页面,然后点击目标集群名称进入其概览页面
1. 进入 [**Clusters**](https://tidbcloud.com/console/clusters) 页面,然后点击目标集群名称,进入其概览页面

2. 点击右上角的 **Connect**,弹出连接对话框。

3. 在连接对话框中,从 **Connection Type** 下拉列表选择 **Public**,然后点击 **CA cert** 下载 CA 证书。

如果你还没有配置 IP 访问列表,请点击 **Configure IP Access List**,或参考 [Configure an IP Access List](https://docs.pingcap.com/tidbcloud/configure-ip-access-list) 进行配置后再首次连接
如果你还未配置 IP 访问列表,请点击 **Configure IP Access List**,或参照 [配置 IP 访问列表](https://docs.pingcap.com/tidbcloud/configure-ip-access-list) 进行首次连接前的配置

除了 **Public** 连接类型,TiDB Cloud Dedicated 还支持 **Private Endpoint** 和 **VPC Peering** 连接类型。更多信息请参见 [Connect to Your TiDB Cloud Dedicated Cluster](https://docs.pingcap.com/tidbcloud/connect-to-tidb-cluster)。
除了 **Public** 连接类型,TiDB Cloud Dedicated 还支持 **Private Endpoint** 和 **VPC Peering** 连接类型。更多信息参见 [连接到你的 TiDB Cloud Dedicated 集群](https://docs.pingcap.com/tidbcloud/connect-to-tidb-cluster)。

4. 运行以下命令,复制 `env.sh.example` 并重命名为 `env.sh`:

Expand All @@ -137,12 +137,12 @@ cd tidb-java-hibernate-quickstart
export USE_SSL='false'
```

请务必将 `{}` 占位符替换为连接对话框中获取的连接参数
请务必将 `{}` 占位符替换为连接对话框中获得的连接参数

6. 保存 `env.sh` 文件。

</div>
<div label="TiDB 自建版">
<div label="自建 TiDB">

1. 运行以下命令,复制 `env.sh.example` 并重命名为 `env.sh`:

Expand All @@ -168,21 +168,21 @@ cd tidb-java-hibernate-quickstart
</div>
</SimpleTab>

### 第 3 步:运行代码并检查结果
### 步骤 3:运行代码并检查结果

1. 执行以下命令运行示例代码:

```shell
make
```

2. 检查 [Expected-Output.txt](https://github.com/tidb-samples/tidb-java-hibernate-quickstart/blob/main/Expected-Output.txt) 以确认输出是否一致
2. 检查 [Expected-Output.txt](https://github.com/tidb-samples/tidb-java-hibernate-quickstart/blob/main/Expected-Output.txt) 输出是否一致

## 示例代码片段

你可以参考以下示例代码片段,完成你自己的应用开发。

完整示例代码及运行方法请参考 [tidb-samples/tidb-java-hibernate-quickstart](https://github.com/tidb-samples/tidb-java-hibernate-quickstart) 仓库。
完整示例代码及运行方法请参见 [tidb-samples/tidb-java-hibernate-quickstart](https://github.com/tidb-samples/tidb-java-hibernate-quickstart) 仓库。

### 连接 TiDB

Expand All @@ -198,7 +198,7 @@ cd tidb-java-hibernate-quickstart

<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.TiDBDialect</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.url">${tidb_jdbc_url}</property>
<property name="hibernate.connection.username">${tidb_user}</property>
<property name="hibernate.connection.password">${tidb_password}</property>
Expand All @@ -225,7 +225,7 @@ public SessionFactory getSessionFactory() {
}
```

使用该函数时,需要将 `${your_entity_class}` 替换为你自己的数据实体类。如果有多个实体类,需要为每个实体类添加一条 `.addAnnotatedClass(${your_entity_class})` 语句。上述函数只是配置 Hibernate 的一种方式。如果你在配置过程中遇到问题,或想了解更多 Hibernate 相关内容,请参考 [Hibernate 官方文档](https://hibernate.org/orm/documentation)。
使用该函数时,你需要将 `${your_entity_class}` 替换为你自己的数据实体类。对于多个实体类,需要为每个类添加一条 `.addAnnotatedClass(${your_entity_class})` 语句。上述函数只是配置 Hibernate 的一种方式。如果你在配置过程中遇到问题,或想了解更多 Hibernate 相关内容,请参考 [Hibernate 官方文档](https://hibernate.org/orm/documentation)。

### 插入或更新数据

Expand All @@ -235,7 +235,7 @@ try (Session session = sessionFactory.openSession()) {
}
```

更多信息请参考 [插入数据](/develop/dev-guide-insert-data.md) 和 [更新数据](/develop/dev-guide-update-data.md)。
更多信息参见 [插入数据](/develop/dev-guide-insert-data.md) 和 [修改数据](/develop/dev-guide-update-data.md)。

### 查询数据

Expand All @@ -246,7 +246,7 @@ try (Session session = sessionFactory.openSession()) {
}
```

更多信息请参考 [查询数据](/develop/dev-guide-get-data-from-single-table.md)。
更多信息参见 [查询数据](/develop/dev-guide-get-data-from-single-table.md)。

### 删除数据

Expand All @@ -256,25 +256,61 @@ try (Session session = sessionFactory.openSession()) {
}
```

更多信息请参考 [删除数据](/develop/dev-guide-delete-data.md)。
更多信息参见 [删除数据](/develop/dev-guide-delete-data.md)。

## 与 `MySQLDialect` 的兼容性

当你在 TiDB 中使用 `MySQLDialect` 时,请注意以下行为:

### `SERIALIZABLE` 隔离级别

应用程序如果尝试设置 `SERIALIZABLE` 事务隔离级别,在 TiDB 中会遇到如下错误:

```
The isolation level 'SERIALIZABLE' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error
```

为避免该错误,请在服务器端设置如下 TiDB 系统变量:

```sql
SET GLOBAL tidb_skip_isolation_level_check=1;
```

启用该变量后,TiDB 会接受指定 `SERIALIZABLE` 的请求而不返回错误。内部实际仍采用 `REPEATABLE-READ`,这是 TiDB 的最强隔离级别。更多信息参见 [`tidb_skip_isolation_level_check`](/system-variables.md#tidb_skip_isolation_level_check)。

> **注意:**
>
> 社区维护的 `TiDBDialect` 会自动处理该行为,跳过需要 `SERIALIZABLE` 隔离级别的特性。

### `CHECK` 约束

Hibernate 的 [`@Check`](https://docs.hibernate.org/orm/6.5/javadocs/org/hibernate/annotations/Check.html) 注解会生成 DDL `CHECK` 约束。[MySQL 8.0.16 及以上版本](https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html) 默认会强制执行这些约束,但 TiDB 默认不会强制执行,除非显式开启。

如需在 TiDB 中启用 `CHECK` 约束强制执行,请设置如下系统变量:

```sql
SET GLOBAL tidb_enable_check_constraint=ON;
```

如果未设置该变量,TiDB 会接受 `CHECK` 约束语法但不会强制执行,可能导致数据完整性问题。更多信息参见 [`CHECK` 约束](/constraints.md#check)。

## 后续步骤

- 通过 [Hibernate 文档](https://hibernate.org/orm/documentation) 学习更多 Hibernate 的用法
- 通过 [开发者指南](/develop/dev-guide-overview.md) 各章节学习 TiDB 应用开发最佳实践,例如 [插入数据](/develop/dev-guide-insert-data.md)、[更新数据](/develop/dev-guide-update-data.md)、[删除数据](/develop/dev-guide-delete-data.md)、[单表读取](/develop/dev-guide-get-data-from-single-table.md)、[事务](/develop/dev-guide-transaction-overview.md) [SQL 性能优化](/develop/dev-guide-optimize-sql-overview.md)。
- 通过 [Hibernate 文档](https://hibernate.org/orm/documentation) 学习更多 Hibernate 用法
- 通过 [开发者指南](/develop/dev-guide-overview.md) 各章节学习 TiDB 应用开发最佳实践,例如 [插入数据](/develop/dev-guide-insert-data.md)、[修改数据](/develop/dev-guide-update-data.md)、[删除数据](/develop/dev-guide-delete-data.md)、[单表读取](/develop/dev-guide-get-data-from-single-table.md)、[事务](/develop/dev-guide-transaction-overview.md) 以及 [SQL 性能优化](/develop/dev-guide-optimize-sql-overview.md)。
- 通过专业的 [TiDB 开发者课程](https://www.pingcap.com/education/) 学习,并在通过考试后获得 [TiDB 认证](https://www.pingcap.com/education/certification/)。
- 通过 Java 开发者课程学习:[Working with TiDB from Java](https://eng.edu.pingcap.com/catalog/info/id:212)。

## 需要帮助?

<CustomContent platform="tidb">

在 [Discord](https://discord.gg/DQZ2dy3cuc?utm_source=doc) 或 [Slack](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-docs) 社区提问,或[提交支持工单](/support.md)。
在 [Discord](https://discord.gg/DQZ2dy3cuc?utm_source=doc) 或 [Slack](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-docs) 社区提问,或 [提交支持工单](/support.md)。

</CustomContent>

<CustomContent platform="tidb-cloud">

在 [Discord](https://discord.gg/DQZ2dy3cuc?utm_source=doc) 或 [Slack](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-docs) 社区提问,或[提交支持工单](https://tidb.support.pingcap.com/)。
在 [Discord](https://discord.gg/DQZ2dy3cuc?utm_source=doc) 或 [Slack](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-docs) 社区提问,或 [提交支持工单](https://tidb.support.pingcap.com/)。

</CustomContent>
5 changes: 4 additions & 1 deletion latest_translation_commit.json
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
{"target":"release-8.5","sha":"4b35531be680642691b5fe69a8cfb8a2ef4ccae6"}
{
"target": "release-8.5",
"sha": "58f3928e46f8ec9cf6e89c1ce6b5ef922f5e4054"
}
Loading