Hibernate is an Object/Relational Mapping (ORM) solution for Java environments. You can access Tablestore by using Hibernate to use the Java Database Connectivity (JDBC) driver for Tablestore.
Background information
Hibernate is an Object/Relational Mapping (ORM) solution for Java environments. You can use Hibernate to map Java classes to database tables, map Java data types to SQL data types, and query data. Hibernate can significantly reduce the development time that is spent on manually handling data in SQL and JDBC. For more information, see Hibernate documentation.
Usage notes
The SQL query feature is available in the China (Hangzhou), China (Shanghai), China (Beijing), China (Zhangjiakou), China (Hohhot), China (Ulanqab), China (Shenzhen), China (Chengdu), China (Hong Kong), Singapore, Indonesia (Jakarta), Germany (Frankfurt), SAU (Riyadh - Partner Region), and US (Virginia) regions.
Prerequisites
If you want to query data as a Resource Access Management (RAM) user, a RAM user is created and all SQL operation permissions are granted to the RAM user. You can configure
"Action": "ots:SQL*"
in a custom policy to grant all SQL operation permissions to the RAM user. For more information, see Use a RAM policy to grant permissions to a RAM user.An AccessKey pair that consists of an AccessKey ID and an AccessKey secret is obtained. For more information, see Create an AccessKey pair.
A data table is created, and a mapping table is created for the data table. For more information, see Step 3: Create a data table and Create a mapping table for a table.
Procedure
Step 1: Install the JDBC driver
You can install the JDBC driver by using one of the following methods:
Download the JDBC driver for Tablestore and import the JDBC driver to the project. For more information about the download path, see JDBC driver for Tablestore.
Add dependencies to a Maven project.
To use the JDBC driver for Tablestore in Maven, you need to only add the corresponding dependencies to the pom.xml file. In this example, JDBC driver 5.17.0 is used. Add the following content to <dependencies>:
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore-jdbc</artifactId> <version>5.17.0</version></dependency>
Step 2: Install Hibernate
You can install Hibernate by using one of the following methods:
Download the Hibernate installation package hibernate-core-x.x.x.jar and import the package to the project. For more information about the download path, see Hibernate installation package.
In hibernate-core-x.x.x.jar,
x.x.x
indicates the version number of Hibernate. Download a Hibernate installation package based on your business requirements.Add dependencies to a Maven project.
To use Hibernate in Maven, you need to only add the corresponding dependencies to the pom.xml file. In this example, the 3.6.3.Final version is used. Add the following content to <dependencies>:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.3.Final</version></dependency>
Step 3: Map SQL fields
After you create a Java Bean that contains member variables whose names are the same as the names of fields in the data table, create a mapping configuration file to map the member variables in the Java Bean to the fields in the data table.
Create a Java Bean that contains member variables whose names are the same as the names of fields in the data table.
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; // Add the methods that are used to specify field names and return field values. // In this example, the tripId field is used. You can add the methods that are used to specify field names and return field values for other fields in a similar manner based on your business requirements. public void setTripId(Long tripId){ this.tripId =tripId } public Long getTripId() { return tripId; }}
Create a mapping configuration file to map the member variables in the Java Bean to the fields in the data table. The following sample code shows how to create a mapping configuration file named Trip.hbm.xml in the hibernate directory.
ImportantTablestore SQL does not support data insert and update. Therefore, you must set the insert property and the update property to false. For information about supported data types in SQL, see Data type mappings in SQL. For information about supported SQL features, see SQL features.
<?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> <!--Specify the actual class name. --> <class name="hibernate.Trip" table="trips"> <!-- The field that is configured in the id element is the primary key column of the data table. --> <id name="tripId" column="trip_id" type="long"/> <!-- The fields that are configured in the property element are attribute columns of the data table. You must set the insert property and the update property to false because insert and update operations are prohibited for attribute columns. --> <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>
Step 4: Build the SessionFactory
After you configure the Hibernate configuration file, load the Hibernate configuration file to build the SessionFactory.
Add the following content to the Hibernate configuration file named hibernate.cfg.xml. Modify the configuration items in the configuration file based on your business requirements.
<?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> <!-- Specify the path of the mapping configuration file. --> <mapping resource="hibernate/Trip.hbm.xml"/> </session-factory></hibernate-configuration>
The following table describes the items that you must configure in the Hibernate configuration file.
Configuration item
Type
Required
Example
Description
hibernate.connection.driver_class
class
Yes
com.alicloud.openservices.tablestore.jdbc.OTSDriver
The name of the class for the JDBC driver for Tablestore. Set this configuration item to com.alicloud.openservices.tablestore.jdbc.OTSDriver.
hibernate.connection.url
string
Yes
jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance
The endpoint of the instance. The value must be in the following format:
jdbc:ots:endpoint/instanceName
. endpoint indicates the endpoint of the instance. For more information, see Endpoints. instanceName indicates the name of the instance. Replace instanceName with the actual instance name.When you specify a value for this configuration item, the
jdbc:ots:
prefix must be included in the value.hibernate.connection.username
string
Yes
************************
The AccessKey ID of your Alibaba Cloud account or a RAM user.
hibernate.connection.password
string
Yes
********************************
The AccessKey secret of your Alibaba Cloud account or a RAM user.
hibernate.connection.autocommit
boolean
Yes
true
Specifies whether to automatically commit configurations.
ImportantTablestore does not support transactions. Set hibernate.connection.autocommit to true.
hibernate.dialect
string
Yes
org.hibernate.dialect.MySQLDialect
Tablestore SQL inherits the MySQL syntax. Set this configuration item to
org.hibernate.dialect.MySQLDialect
.Load the Hibernate configuration file to build the SessionFactory.
SessionFactory factory = new Configuration(). configure("hibernate/hibernate.cfg.xml"). buildSessionFactory();
Step 5: Create a session to query data
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();
Complete sample code
The following sample code shows how to query the row in which the value of the primary key column is 99 and return the specified columns of the row:
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"). // Specify the full path of the Hibernate configuration file. buildSessionFactory(); Session session = factory.openSession(); // Set the value of the primary key column to 99. If the row in which the value of the primary key column is 99 does not exist, null is returned. Trip trip = (Trip) session.get(Trip.class, 99L); // Display the column values that you want to obtain. 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
What do I do if the following error message appears when I query data by using Hibernate to use the JDBC driver?
Problem description
When I query data by using Hibernate to use the JDBC driver, the following error message appears:
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) .....
Possible cause
The javassist-x.x.x.jar package is missing.
Solutions
Install the javassist-x.x.x.jar package by using one of the following methods:
Download the javassist installation package javassist-x.x.x.jar and import the package to the project. For more information about the download path, see javassist installation package.
In javassist-x.x.x.jar,
x.x.x
indicates the version number of javassist. Download a javassist installation package based on your business requirements.Add dependencies to a Maven project.
Add the corresponding dependencies to the pom.xml file in the Maven project. In this example, the 3.15.0-GA version is used. Add the following content to <dependencies>:
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.15.0-GA</version></dependency>
What do I do if the Message: Unknown column '{columnName}' in 'field list'
error message appears when I query data by using Hibernate to use the JDBC driver?
Problem description
When I query data by using Hibernate to use the JDBC driver, the
Message: Unknown column '{columnName}' in 'field list'
error message appears.Possible cause
The specified column does not exist in the SQL mapping table.
Solution
Make sure that the specified column exists in the SQL mapping table. You can use one of the following methods to fix the error:
Add the specified column to the predefined columns to automatically synchronize the specified column to the SQL mapping table.
Specify the column when you execute the CREATE TABLE statement to create a mapping table. For more information, see Create a mapping table for a table.
Execute the ALTER TABLE statement to add or remove attribute columns for an existing mapping table. For more information, see Update attribute columns of mapping tables.
References
You can access Tablestore by using JDBC or MyBatis. For more information, see Use MyBatis to query data by executing SQL statements and Use JDBC to access Tablestore.
You can access Tablestore in the Tablestore console or Tablestore CLI, or by using Tablestore SDKs or the Tablestore driver for Go. For more information, see Use the SQL query feature in the Tablestore console, Use the SQL query feature in the Tablestore CLI, Use Tablestore SDKs to use the SQL query feature, and Use the Tablestore driver for Go to query data by executing SQL statements.
If you want to accelerate data queries and computing by executing SQL statements, you can create a secondary index or a search index. For more information, see Index selection policy and Computing pushdown.
You can also use computing engines, such as MaxCompute, Spark, Hive, HadoopMR, Function Compute, Flink, and PrestoDB, to compute and analyze data in tables. For more information, see Overview.
To visualize data, you can use Grafana. For example, you can use Grafana to display Tablestore data in charts. For more information, see Connect Tablestore to Grafana.