Hibernate は、Java 環境向けのオブジェクト/リレーショナル マッピング (ORM) ソリューションです。Hibernate を使用して Tablestore の Java Database Connectivity (JDBC) ドライバーを使用することで、Tablestore にアクセスできます。
背景情報
Hibernate は、Java 環境向けのオブジェクト/リレーショナル マッピング (ORM) ソリューションです。Hibernate を使用すると、Java クラスをデータベース テーブルにマッピングし、Java データ型を SQL データ型にマッピングし、データをクエリできます。Hibernate は、SQL と JDBC で手動でデータを処理するのに費やされる開発時間を大幅に短縮できます。詳細については、Hibernate のドキュメントを参照してください。
注意事項
SQL クエリ機能は、中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (成都)、中国 (香港)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、英国 (ロンドン)、米国 (シリコンバレー)、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、SAU (リヤド - パートナーリージョン)、および米国 (バージニア) の各リージョンでご利用いただけます。
前提条件
RAM ユーザーとしてデータをクエリする場合、RAM ユーザーが作成され、すべての SQL 操作権限が RAM ユーザーに付与されます。RAM ユーザーにアタッチされたカスタムポリシーで
"Action": "ots:SQL*"
を設定することで、すべての SQL 操作権限を RAM ユーザーに付与できます。詳細については、RAM ポリシーを使用して RAM ユーザーに権限を付与するを参照してください。アクセスキー ID とアクセスキーシークレットで構成されるアクセスキーペアを取得します。詳細については、アクセスキーペアを作成するを参照してください。
データテーブルが作成され、データテーブルのマッピングテーブルが作成されます。詳細については、ステップ 3: データテーブルを作成するおよびテーブルのマッピングテーブルを作成するを参照してください。
手順
ステップ 1: JDBC ドライバーをインストールする
JDBC ドライバーは、次のいずれかの方法でインストールできます。
Tablestore の JDBC ドライバーをダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、Tablestore の JDBC ドライバーを参照してください。
Maven プロジェクトに依存関係を追加します。
Maven で Tablestore の JDBC ドライバーを使用するには、対応する依存関係を pom.xml ファイルに追加するだけです。この例では、JDBC ドライバー 5.17.0 を使用しています。<dependencies> に次のコンテンツを追加します。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore-jdbc</artifactId> <version>5.17.0</version></dependency>
ステップ 2: Hibernate をインストールする
Hibernate は、次のいずれかの方法でインストールできます。
Hibernate インストールパッケージ hibernate-core-x.x.x.jar をダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、Hibernate インストールパッケージを参照してください。
hibernate-core-x.x.x.jar では、
x.x.x
は Hibernate のバージョン番号を示します。ビジネス要件に基づいて Hibernate インストールパッケージをダウンロードしてください。Maven プロジェクトに依存関係を追加します。
Maven で Hibernate を使用するには、対応する依存関係を pom.xml ファイルに追加するだけです。この例では、3.6.3.Final バージョンを使用しています。<dependencies> に次のコンテンツを追加します。
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.3.Final</version></dependency>
ステップ 3: SQL フィールドをマッピングする
データテーブルのフィールド名と同じ名前のメンバー変数を含む Java Bean を作成した後、マッピング設定ファイルを作成して、Java Bean のメンバー変数をデータテーブルのフィールドにマッピングします。
データテーブルのフィールド名と同じ名前のメンバー変数を含む Java Bean を作成します。
package hibernate;public class Trip { private long tripId; private long duration; private String startDate; private String endDate; private long startStationNumber; private long endStationNumber; private String startStation; private String endStation; private String bikeNumber; private String memberType; // フィールド名を指定し、フィールド値を返すために使用されるメソッドを追加します。 // この例では、tripId フィールドを使用しています。ビジネス要件に基づいて、他のフィールドのフィールド名を指定し、フィールド値を返すために使用されるメソッドを同様の方法で追加できます。 public void setTripId(Long tripId){ this.tripId =tripId } public Long getTripId() { return tripId; }}
マッピング設定ファイルを作成して、Java Bean のメンバー変数をデータテーブルのフィールドにマッピングします。次のサンプルコードは、hibernate ディレクトリに Trip.hbm.xml という名前のマッピング設定ファイルを作成する方法を示しています。
重要Tablestore SQL はデータの挿入と更新をサポートしていません。したがって、insert プロパティと update プロパティを false に設定する必要があります。SQL でサポートされているデータ型の詳細については、SQL でのデータ型マッピングを参照してください。サポートされている SQL 機能の詳細については、SQL 機能を参照してください。
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <!--実際のクラス名を指定します。--> <class name="hibernate.Trip" table="trips"> <!--id 要素で設定されているフィールドは、データテーブルのプライマリキー列です。--> <id name="tripId" column="trip_id" type="long"/> <!--property 要素で設定されているフィールドは、データテーブルの属性列です。属性列では挿入操作と更新操作が禁止されているため、insert プロパティと update プロパティを false に設定する必要があります。--> <property name="duration" column="duration" type="long" insert="false" update="false"/> <property name="startDate" column="start_date" type="string" insert="false" update="false"/> <property name="endDate" column="end_date" type="string" insert="false" update="false"/> <property name="startStationNumber" column="start_station_number" type="long" insert="false" update="false"/> <property name="endStationNumber" column="end_station_number" type="long" insert="false" update="false"/> <property name="startStation" column="start_station" type="string" insert="false" update="false"/> <property name="endStation" column="end_station" type="string" insert="false" update="false"/> <property name="bikeNumber" column="bike_number" type="string" insert="false" update="false"/> <property name="memberType" column="member_type" type="string" insert="false" update="false"/> </class></hibernate-mapping>
ステップ 4: SessionFactory をビルドする
Hibernate 設定ファイルを構成した後、Hibernate 設定ファイルをロードして SessionFactory をビルドします。
hibernate.cfg.xml という名前の Hibernate 設定ファイルに次のコンテンツを追加します。ビジネス要件に基づいて、設定ファイルの設定項目を変更します。
<?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> <property name="hibernate.connection.driver_class">com.alicloud.openservices.tablestore.jdbc.OTSDriver</property> <property name="hibernate.connection.url">jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance</property> <property name="hibernate.connection.username">************************</property> <property name="hibernate.connection.password">********************************</property> <property name="hibernate.connection.autocommit">true</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--マッピング設定ファイルのパスを指定します。--> <mapping resource="hibernate/Trip.hbm.xml"/> </session-factory></hibernate-configuration>
次の表は、Hibernate 設定ファイルで設定する必要がある項目について説明しています。
設定項目
タイプ
必須
例
説明
hibernate.connection.driver_class
class
はい
com.alicloud.openservices.tablestore.jdbc.OTSDriver
Tablestore の JDBC ドライバーのクラス名。この設定項目を com.alicloud.openservices.tablestore.jdbc.OTSDriver に設定します。
hibernate.connection.url
string
はい
jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance
インスタンスのエンドポイント。値は
jdbc:ots:endpoint/instanceName
の形式である必要があります。endpoint はインスタンスのエンドポイントを示します。詳細については、エンドポイントを参照してください。instanceName はインスタンスの名前を示します。instanceName を実際のインスタンス名に置き換えます。この設定項目の値を指定する場合、値に
jdbc:ots:
プレフィックスを含める必要があります。hibernate.connection.username
string
はい
************************
Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキー ID。
hibernate.connection.password
string
はい
********************************
Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキーシークレット。
hibernate.connection.autocommit
boolean
はい
true
設定を自動的にコミットするかどうかを指定します。
重要Tablestore はトランザクションをサポートしていません。hibernate.connection.autocommit を true に設定します。
hibernate.dialect
string
はい
org.hibernate.dialect.MySQLDialect
Tablestore SQL は MySQL 構文を継承しています。この設定項目を
org.hibernate.dialect.MySQLDialect
に設定します。Hibernate 設定ファイルをロードして SessionFactory をビルドします。
SessionFactory factory = new Configuration(). configure("hibernate/hibernate.cfg.xml"). buildSessionFactory();
ステップ 5: セッションを作成してデータをクエリする
Session session = factory.openSession();Trip trip = (Trip) session.get(Trip.class, 99L); System.out.println("trip id: " + trip.getTripId());System.out.println("start date: " + trip.getStartDate());System.out.println("end date: " + trip.getEndDate());System.out.println("duration: " + trip.getDuration());session.close();factory.close();
完全なサンプルコード
次のサンプルコードは、プライマリキー列の値が 99 である行をクエリし、その行の指定された列を返す方法を示しています。
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import hibernate.Trip;public class HibernateDemo { public static void main(String[] args) { SessionFactory factory = new Configuration(). configure("hibernate/hibernate.cfg.xml"). // Hibernate 設定ファイルのフルパスを指定します。 buildSessionFactory(); Session session = factory.openSession(); // プライマリキー列の値を 99 に設定します。プライマリキー列の値が 99 である行が存在しない場合、null が返されます。 Trip trip = (Trip) session.get(Trip.class, 99L); // 取得する列の値を表示します。 System.out.println("trip id: " + trip.getTripId()); System.out.println("start date: " + trip.getStartDate()); System.out.println("end date: " + trip.getEndDate()); System.out.println("duration: " + trip.getDuration()); session.close(); factory.close(); }}
FAQ
Hibernate を使用して JDBC ドライバーを使用してデータをクエリするときに、次のエラーメッセージが表示された場合はどうすればよいですか?
問題の説明
Hibernate を使用して JDBC ドライバーを使用してデータをクエリすると、次のエラーメッセージが表示されます。
Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:108) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:133) at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80) at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:322) at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:485) at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133) at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286) .....
考えられる原因
javassist-x.x.x.jar パッケージがありません。
解決策
次のいずれかの方法で javassist-x.x.x.jar パッケージをインストールします。
javassist インストールパッケージ javassist-x.x.x.jar をダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、javassist インストールパッケージを参照してください。
javassist-x.x.x.jar では、
x.x.x
は javassist のバージョン番号を示します。ビジネス要件に基づいて javassist インストールパッケージをダウンロードしてください。Maven プロジェクトに依存関係を追加します。
Maven プロジェクトの pom.xml ファイルに対応する依存関係を追加します。この例では、3.15.0-GA バージョンを使用しています。<dependencies> に次のコンテンツを追加します。
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.15.0-GA</version></dependency>
Hibernate を使用して JDBC ドライバーを使用してデータをクエリするときに、Message: Unknown column '{columnName}' in 'field list'
エラーメッセージが表示された場合はどうすればよいですか?
問題の説明
Hibernate を使用して JDBC ドライバーを使用してデータをクエリすると、
Message: Unknown column '{columnName}' in 'field list'
エラーメッセージが表示されます。考えられる原因
指定された列が SQL マッピングテーブルに存在しません。
解決策
指定された列が SQL マッピングテーブルに存在することを確認します。次のいずれかの方法を使用してエラーを修正できます。
指定された列を事前定義された列に追加して、指定された列を SQL マッピングテーブルに自動的に同期します。
CREATE TABLE ステートメントを実行してマッピングテーブルを作成するときに、列を指定します。詳細については、テーブルのマッピングテーブルを作成するを参照してください。
ALTER TABLE ステートメントを実行して、既存のマッピングテーブルの属性列を追加または削除します。詳細については、マッピングテーブルの属性列を更新するを参照してください。
関連情報
JDBC または MyBatis を使用して Tablestore にアクセスできます。詳細については、MyBatis を使用して SQL ステートメントを実行することでデータをクエリするおよびJDBC を使用して Tablestore にアクセスするを参照してください。
Tablestore コンソール、Tablestore CLI、Tablestore SDK、または Go 用 Tablestore ドライバーを使用して Tablestore にアクセスできます。詳細については、Tablestore コンソールで SQL クエリ機能を使用する、Tablestore CLI で SQL クエリ機能を使用する、Tablestore SDK を使用して SQL クエリ機能を使用する、およびGo 用 Tablestore ドライバーを使用して SQL ステートメントを実行することでデータをクエリするを参照してください。
SQL ステートメントを実行することでデータクエリと計算を高速化する場合、セカンダリインデックスまたは検索インデックスを作成できます。詳細については、インデックス選択ポリシーおよび計算プッシュダウンを参照してください。
MaxCompute、Spark、Hive、HadoopMR、Function Compute、Flink、PrestoDB などの計算エンジンを使用して、テーブル内のデータの計算と分析を行うこともできます。詳細については、概要を参照してください。
データを視覚化するには、Grafana を使用できます。たとえば、Grafana を使用して Tablestore データをグラフに表示できます。詳細については、Tablestore を Grafana に接続するを参照してください。