📣
TiDB Cloud Essential はパブリックプレビュー中です。このページは自動翻訳されたものです。原文はこちらからご覧ください。

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に接続してください。

    1. 私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。

    2. 右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。

      • 接続タイプPublicに設定されています。

      • ブランチmainに設定されています。

      • Connect With はGeneralに設定されています。

      • お使いの環境に合ったオペレーティングシステムを選択してください。

      ヒント:

      プログラムがWindows Subsystem for Linux(WSL)上で実行されている場合は、対応するLinuxディストリビューションに切り替えてください。

    4. 「パスワードを生成」をクリックすると、ランダムなパスワードが生成されます。

      ヒント:

      以前にパスワードを作成したことがある場合は、元のパスワードを使用するか、 「パスワードをリセット」をクリックして新しいパスワードを生成できます。

    5. env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。

      cp env.sh.example env.sh
    6. 対応する接続​​文字列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に設定する必要があります。

    7. env.shファイルを保存します。

    1. 私のTiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。

    2. 右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログで、「接続タイプ」ドロップダウンリストから「パブリック」を選択し、 「CA証明書」をクリックしてCA証明書をダウンロードします。

      IP アクセス リストを設定していない場合は、最初の接続の前に、 [IP アクセス リストの設定] をクリックするか、「IP アクセス リストを設定する」の手順に従ってIPアクセスリストを設定する

      TiDB Cloud Dedicated は、パブリック接続タイプに加えて、プライベート エンドポイントおよびVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続します参照してください。

    4. env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。

      cp env.sh.example env.sh
    5. 対応する接続​​文字列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'

      必ずプレースホルダー{}を、接続ダイアログから取得した接続パラメータに置き換えてください。

    6. env.shファイルを保存します。

    1. env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。

      cp env.sh.example env.sh
    2. 対応する接続​​文字列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_SSL falseに設定してください。TiDB をローカルで実行している場合、デフォルトのホスト アドレスは127.0.0.1で、パスワードは空です。

    3. env.shファイルを保存します。

    ステップ3:コードを実行して結果を確認する

    1. サンプルコードを実行するには、以下のコマンドを実行してください。

      make
    2. 期待される出力.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参照してください。

    注記:

    コミュニティが管理するTiDBDialect SERIALIZABLE分離レベルを必要とする機能をスキップすることで、この動作を自動的に処理します。

    CHECK制約

    Hibernate の@Checkアノテーションは、DDL CHECK制約を生成します。 MySQL 8.0.16以降のバージョンでは、これらの制約がデフォルトで強制されますが、TiDB は明示的に有効にされない限り、これらの制約を強制しません。

    TiDBでCHECK制約の適用を有効にするには、次のシステム変数を設定します。

    SET GLOBAL tidb_enable_check_constraint=ON;

    この設定がない場合、TiDB はCHECK制約構文を受け入れますが、それを強制しないため、予期しないデータ整合性の問題が発生する可能性があります。詳細については、 CHECK制約参照してください。 。

    次のステップ

    お困りですか?

    このページは役に立ちましたか?