Hibernate是面向Java环境的对象/关系映射(ORM)解决方案,您可以通过Hibernate使用表格存储的JDBC驱动来快速访问表格存储。
背景信息
Hibernate是面向Java环境的对象/关系映射(ORM)解决方案,主要负责从Java类到数据库表的映射以及从Java数据类型到SQL数据类型的映射,同时还支持数据查询。使用Hibernate能有效减少在SQL和JDBC中手动处理数据所花费的时间。更多信息,请参见Hibernate官网文档。
注意事项
目前支持使用SQL查询功能的地域有华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、西南1(成都)、中国香港、新加坡、印度尼西亚(雅加达)、德国(法兰克福)和美国(弗吉尼亚)。
前提条件
如果要使用RAM用户进行操作,请确保已创建RAM用户,并为RAM用户授予所有SQL操作权限,即在自定义权限策略中配置
"Action": "ots:SQL*"
。具体操作,请参见通过RAM Policy为RAM用户授权。已获取AccessKey(包括AccessKey ID和AccessKey Secret)。具体操作,请参见创建AccessKey。
使用流程
步骤一:安装JDBC驱动
您可以通过以下两种方式安装JDBC驱动。
下载表格存储JDBC驱动并导入到项目中。具体下载路径请参见表格存储JDBC驱动。
在Maven项目中加入依赖项
在Maven工程中使用表格存储JDBC驱动,只需在pom.xml中加入相应依赖即可。以5.17.0版本为例,在<dependencies>内加入如下内容:
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore-jdbc</artifactId> <version>5.17.0</version> </dependency>
步骤二:安装Hibernate
您可以通过以下两种方式安装Hibernate。
下载Hibernate安装包(即hibernate-core-x.x.x.jar)并导入到项目中。具体下载路径请参见Hibernate安装包。
hibernate-core-x.x.x.jar中的
x.x.x
表示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>
步骤三:映射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为例介绍。
<?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>
步骤四:构建SessionFactory
完成Hibernate配置文件设置后,通过加载Hibernate配置文件来创建SessionFactory。
创建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> <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.connection.driver_class
class
是
com.alicloud.openservices.tablestore.jdbc.OTSDriver
表格存储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为实例名称,请根据实际情况修改。填写时必须加上前缀
jdbc:ots:
。hibernate.connection.username
string
是
************************
阿里云账号或者RAM用户的AccessKey ID。
hibernate.connection.password
string
是
********************************
阿里云账号或者RAM用户的AccessKey Secret。
hibernate.connection.autocommit
boolean
是
true
是否自动提交。
重要由于表格存储目前暂不支持事务,因此autocommit配置项必须设置为true。
hibernate.dialect
string
是
org.hibernate.dialect.MySQLDialect
表格存储SQL继承了MySQL语法,设置为
org.hibernate.dialect.MySQLDialect
。通过加载Hibernate配置文件来构建SessionFactory。
SessionFactory factory = new Configuration(). configure("hibernate/hibernate.cfg.xml"). buildSessionFactory();
步骤五:创建Session查询数据
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。如果行数据不存在,则返回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();
}
}
常见问题处理
当通过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的版本号,请根据实际下载所需版本的安装包。在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'
错误,我该如何解决?
相关文档
您还可以通过JDBC直连、MyBatis等方式使用JDBC访问表格存储。具体操作,请参见通过MyBatis使用SQL查询数据和JDBC连接表格存储。
您还可以通过控制台、命令行工具、表格存储SDK、Go语言驱动等方式访问表格存储。具体操作,请参见通过控制台使用SQL查询、通过命令行工具使用SQL查询、通过SDK使用SQL查询、通过Go语言驱动使用SQL查询。
您还可以将Tablestore实例接入到DataWorks或DMS,然后使用SQL查询与分析Tablestore数据。更多信息,请参见接入到DataWorks和接入到DMS。
您还可以通过MaxCompute、Spark、Hive或者HadoopMR、函数计算、Flink、PrestoDB等计算引擎实现表中数据的计算与分析。具体操作,请参见计算与分析。
如果要以图表等形式可视化展示数据,您可以通过对接Grafana实现。更多信息,请参见对接Grafana。
使用宽表模型可以实现元数据、大数据等多种场景的解决方案,例如搭建海量智能元数据管理系统、亿量级订单管理方案、基于多元索引搭建亿量级店铺搜索系统、表格存储结合Spark流批处理实现一体化存储和计算、表格存储结合实时计算Flink进行大数据分析。更多方案介绍,请参见快速玩转Tablestore入门与实战。
使用时序模型可以实现设备时序数据开发等方案。更多方案介绍,请参见快速玩转Tablestore入门与实战。
表格存储控制台提供了电商订单、共享汽车、快递轨迹追溯、店铺搜索、地理围栏、智能元数据等产品应用场景的场景Demo。具体样例请参见场景Demo。
SQL查询可应用在表格存储物联网存储IoTstore解决方案中作为不同类型数据的统一查询接口。更多信息,请参见物联网存储简介。
物联网存储IoTstore是表格存储基于物联网场景中多源异构数据存储、高并发吞吐、海量数据高性价比存储、多维度数据处理与分析等需求推出的一站式物联网解决方案,可为物联网设备元数据、消息数据、时序轨迹等海量数据提供存储、查询、检索、分析、同步等能力。