📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

Hibernateを使用してTiDBに接続する



TiDBはMySQL互換データベースであり、Hibernateは人気のオープンソースJava ORMです。TiDBはMySQLとの互換性が非常に高いため、長期的な互換性を確保するには、Hibernateの方言としてorg.hibernate.dialect.MySQLDialectを使用することをお勧めします。あるいは、 Hibernateコミュニティ方言にはTiDB専用の方言( org.hibernate.community.dialect.TiDBDialect )も用意されていますが、PingCAPではメンテナンスされていません。 MySQLDialectを使用して互換性の問題が発生した場合は、GitHubで問題を報告してください。

このチュートリアルでは、TiDBとHibernateを使用して以下のタスクを実行する方法を学ぶことができます。

  • 環境をセットアップしてください。
  • Hibernateを使用してTiDBに接続します。
  • アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Java Development Kit (JDK) 17以降が必要です。業務要件や個人のニーズに応じて、 OpenJDKまたはOracle JDKを選択できます。
  • Maven3.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. My TiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。

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

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

      • Connection TypePublicに設定されています。

      • Branchmainに設定されています。

      • Connect WithGeneralに設定されています。

      • お使いの環境に合ったOperating Systemを選択してください。

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

    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. My TiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。

    2. 左側のナビゲーションペインで、 Settings > Networkingをクリックします。

    3. Networkingページで、Public EndpointEnableをクリックし、次にAdd IP Addressをクリックします。

      クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。

    4. 左側のナビゲーションペインでOverviewをクリックすると、インスタンスの概要ページに戻ります。

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

    6. 接続ダイアログで、 Connection TypeドロップダウンリストからPublicを選択します。

      • 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
      • まだパスワードを設定していない場合は、ダイアログのSet Root Passwordをクリックしてください。
      • サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 CA certをクリックしてダウンロードしてください。
      • Public接続タイプに加えて、 TiDB Cloud Premium はPrivate Endpoint接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続しますを参照してください。
    7. env.sh.exampleをコピーしてenv.shに名前を変更するには、次のコマンドを実行します。

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

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

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

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

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

    3. 接続ダイアログで、 Connection TypeドロップダウンリストからPublicを選択し、 CA certをクリックしてCA証明書をダウンロードします。

      IP アクセス リストを設定していない場合は、最初の接続の前に、 Configure IP Access Listをクリックするか、IP アクセス リストを設定するの手順に従って設定します。

      TiDB Cloud Dedicated は、Public接続タイプに加えて、Private EndpointおよびVPC Peering接続タイプもサポートしています。詳細については、 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. Expected-Output.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を参照してください。

    CHECK制約

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

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

    SET GLOBAL tidb_enable_check_constraint=ON;

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

    次のステップ

    お困りですか?

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