Hibernateを使用してTiDBに接続する
TiDBはMySQL互換データベースであり、ハイバネイト人気のオープンソースJava ORMです。TiDBはMySQLとの互換性が非常に高いため、長期的な互換性を確保するには、Hibernateの方言としてorg.hibernate.dialect.MySQLDialect使用することをお勧めします。あるいは、 Hibernateコミュニティ方言にはTiDB専用の方言( org.hibernate.community.dialect.TiDBDialect )も用意されていますが、PingCAPではメンテナンスされていません。 MySQLDialectを使用して互換性の問題が発生した場合は、GitHubで問題報告してください。
このチュートリアルでは、TiDBとHibernateを使用して以下のタスクを実行する方法を学ぶことができます。
- 環境をセットアップしてください。
- Hibernateを使用してTiDBに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。
注記:
このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Dedicated、およびTiDB Self-Managedに対応しています。
前提条件
このチュートリアルを完了するには、以下が必要です。
- Java Development Kit (JDK) 17以降が必要です。業務要件や個人のニーズに応じて、 OpenJDKまたはOracle JDKを選択できます。
- メイブン3.8以上。
- Git 。
- TiDBクラスタ。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
TiDBに接続するには、サンプルアプリを実行してください。
このセクションでは、サンプルアプリケーションコードを実行してTiDBに接続する方法を説明します。
ステップ1:サンプルアプリのリポジトリをクローンする
サンプルコードリポジトリをクローンするには、ターミナルウィンドウで以下のコマンドを実行してください。
git clone https://github.com/tidb-samples/tidb-java-hibernate-quickstart.git
cd tidb-java-hibernate-quickstart
ステップ2:接続情報を設定する
選択したTiDBのデプロイオプションに応じて、TiDBに接続してください。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。Connect With は
Generalに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
ヒント:
プログラムがWindows Subsystem for Linux(WSL)上で実行されている場合は、対応するLinuxディストリビューションに切り替えてください。
「パスワードを生成」をクリックすると、ランダムなパスワードが生成されます。
ヒント:
以前にパスワードを作成したことがある場合は、元のパスワードを使用するか、 「パスワードをリセット」をクリックして新しいパスワードを生成できます。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' # e.g. gateway01.ap-northeast-1.prod.aws.tidbcloud.com export TIDB_PORT='4000' export TIDB_USER='{user}' # e.g. xxxxxx.root export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='true'必ずプレースホルダー
{}を、接続ダイアログから取得した接続パラメータに置き換えてください。TiDB Cloud Starter は安全な接続を必要とします。そのため、
USE_SSLの値をtrueに設定する必要があります。env.shファイルを保存します。
私のTiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、「接続タイプ」ドロップダウンリストから「パブリック」を選択し、 「CA証明書」をクリックしてCA証明書をダウンロードします。
IP アクセス リストを設定していない場合は、最初の接続の前に、 [IP アクセス リストの設定] をクリックするか、「IP アクセス リストを設定する」の手順に従ってIPアクセスリストを設定する。
TiDB Cloud Dedicated は、パブリック接続タイプに加えて、プライベート エンドポイントおよびVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続します参照してください。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' # e.g. tidb.xxxx.clusters.tidb-cloud.com export TIDB_PORT='4000' export TIDB_USER='{user}' # e.g. root export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='false'必ずプレースホルダー
{}を、接続ダイアログから取得した接続パラメータに置き換えてください。env.shファイルを保存します。
env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。cp env.sh.example env.sh対応する接続文字列
env.shファイルにコピー&ペーストしてください。例は以下のとおりです。export TIDB_HOST='{host}' export TIDB_PORT='4000' export TIDB_USER='root' export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='false'プレースホルダー
{}を接続パラメータに置き換え、USE_SSLfalseに設定してください。TiDB をローカルで実行している場合、デフォルトのホスト アドレスは127.0.0.1で、パスワードは空です。env.shファイルを保存します。
ステップ3:コードを実行して結果を確認する
サンプルコードを実行するには、以下のコマンドを実行してください。
make期待される出力.txtをチェックして、出力が一致するかどうかを確認してください。
サンプルコードスニペット
以下のサンプルコードスニペットを参考に、独自のアプリケーション開発を完成させてください。
完全なサンプルコードと実行方法については、 tidb-samples/tidb-java-hibernate-quickstartリポジトリを参照してください。
TiDBに接続する
Hibernateの設定ファイルhibernate.cfg.xmlを編集します。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</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>
<property name="hibernate.connection.autocommit">false</property>
<!-- Required so a table can be created from the 'PlayerDAO' class -->
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<!-- Optional: Show SQL output for debugging -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
${tidb_jdbc_url} 、 ${tidb_user} 、および${tidb_password}を、ご使用のTiDBの実際の値に置き換えてください。次に、以下の関数を定義します。
public SessionFactory getSessionFactory() {
return new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(${your_entity_class})
.buildSessionFactory();
}
この関数を使用する際は、 ${your_entity_class}独自のデータエンティティクラスに置き換える必要があります。複数のエンティティクラスを使用する場合は、それぞれに.addAnnotatedClass(${your_entity_class})ステートメントを追加する必要があります。上記の関数は、Hibernate を設定する方法の 1 つにすぎません。設定で問題が発生した場合、または Hibernate についてさらに詳しく知りたい場合は、 Hibernateの公式ドキュメントを参照してください。
データを挿入または更新する
try (Session session = sessionFactory.openSession()) {
session.persist(new PlayerBean("id", 1, 1));
}
詳細については、データを挿入するデータの更新を参照してください。
クエリデータ
try (Session session = sessionFactory.openSession()) {
PlayerBean player = session.get(PlayerBean.class, "id");
System.out.println(player);
}
詳細については、 クエリデータを参照してください。
データを削除する
try (Session session = sessionFactory.openSession()) {
session.remove(new PlayerBean("id", 1, 1));
}
詳細については、データを削除するを参照してください。
MySQLDialectとの互換性
TiDB でMySQLDialectを使用する場合は、以下の動作に注意してください。
SERIALIZABLE分離レベル
TiDB でSERIALIZABLEトランザクション分離レベルを設定しようとするアプリケーションは、次のエラーに遭遇します。
The isolation level 'SERIALIZABLE' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error
このエラーを回避するには、サーバー側で以下のTiDBシステム変数を設定してください。
SET GLOBAL tidb_skip_isolation_level_check=1;
この変数を有効にすると、TiDB はSERIALIZABLEを指定したリクエストをエラーを返さずに受け入れます。内部的には、TiDB は引き続き最も強力な分離レベルであるREPEATABLE-READを使用します。詳細については、 tidb_skip_isolation_level_check参照してください。
注記:
コミュニティが管理する
TiDBDialectSERIALIZABLE分離レベルを必要とする機能をスキップすることで、この動作を自動的に処理します。
CHECK制約
Hibernate の@Checkアノテーションは、DDL CHECK制約を生成します。 MySQL 8.0.16以降のバージョンでは、これらの制約がデフォルトで強制されますが、TiDB は明示的に有効にされない限り、これらの制約を強制しません。
TiDBでCHECK制約の適用を有効にするには、次のシステム変数を設定します。
SET GLOBAL tidb_enable_check_constraint=ON;
この設定がない場合、TiDB はCHECK制約構文を受け入れますが、それを強制しないため、予期しないデータ整合性の問題が発生する可能性があります。詳細については、 CHECK制約参照してください。 。
次のステップ
- Hibernate の使用法の詳細についてはHibernateのドキュメント参照してください。
- 開発者ガイドデータを挿入するデータの更新、データを削除する、「SQL パフォーマンス最適化」などの章単一表の読み取り読んで、TiDB アプリケーション 取引SQLパフォーマンス最適化。
- プロフェッショナルなTiDB開発者向けコースコースを通じて学習し、試験に合格するとTiDB認定資格を取得します。
- Java開発者向けのコース「 JavaからTiDBを操作するを通じて学習します。
お困りですか?
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください
- TiDB Self-Managedのサポートチケットを送信してください