Integre o driver JDBC do Tablestore ao ORM Hibernate para consultar dados do Tablestore em uma aplicação Java.
Pré-requisitos
Um par de AccessKey. Usuários RAM precisam da permissão
"Action": "ots:SQL*".Uma tabela de dados e operações DDL configuradas para consultas SQL.
Procedimento
Etapa 1: Instale o driver JDBC
Instale o driver JDBC de uma das seguintes formas:
Maven dependency
Adicione a seguinte dependência ao arquivo pom.xml do seu projeto Maven. Este exemplo usa a versão 5.17.0:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore-jdbc</artifactId>
<version>5.17.0</version>
</dependency>
Manual installation
Baixe o driver JDBC do Tablestore e importe-o para o seu projeto.
Etapa 2: Instale o Hibernate
Instale o Hibernate de uma das seguintes formas:
Maven dependency
Adicione a seguinte dependência ao arquivo pom.xml do seu projeto Maven. Este exemplo usa a versão 3.6.3.Final:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.3.Final</version>
</dependency>
Manual installation
Baixe o Hibernate e importe-o para o seu projeto.
Etapa 3: Mapear colunas SQL
Crie um Java Bean e um arquivo de configuração de mapeamento para associar as propriedades do bean às colunas da tabela.
-
Crie um Java Bean com propriedades correspondentes às colunas da tabela.
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; // Use tripId as an example. Other fields are similar. public void setTripId(Long tripId){ this.tripId = tripId; } public Long getTripId() { return tripId; } } -
Crie um arquivo
Trip.hbm.xmlno diretóriohibernatecom o conteúdo abaixo. Esse arquivo mapeia as propriedades do bean para as colunas da tabela.ImportantePara consultas somente leitura, defina os atributos
inserteupdatedas colunas de atributo comofalsepara impedir que o Hibernate gere instruções de escrita. Para regras de mapeamento de tipos de dados SQL, consulte Mapeamentos de tipos de dados em 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> <!--The class name must match the actual class name.--> <class name="hibernate.Trip" table="trips"> <!-- The field configured in the id element is the primary key column of the table.--> <id name="tripId" column="trip_id" type="long"/> <!-- For read-only queries, set insert and update to false 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>
Etapa 4: Crie um SessionFactory
Após criar os arquivos de configuração, carregue a configuração do Hibernate para criar um SessionFactory.
-
Crie um arquivo de configuração do Hibernate chamado
hibernate.cfg.xmlcom o conteúdo a seguir. Substitua os valores de configuração pelos seus valores reais.<?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> <!-- Set this to the path of the mapping configuration file.--> <mapping resource="hibernate/Trip.hbm.xml"/> </session-factory> </hibernate-configuration>Propriedades de configuração:
Propriedade
Tipo
Obrigatório
Descrição
hibernate.connection.driver_class
class
Sim
Nome da classe do driver JDBC do Tablestore. Defina como
com.alicloud.openservices.tablestore.jdbc.OTSDriver.hibernate.connection.url
string
Sim
URL da instância do Tablestore no formato
jdbc:ots:endpoint/instanceName. Substituaendpointpelo endpoint do serviço einstanceNamepelo nome da sua instância.hibernate.connection.username
string
Sim
AccessKey ID da sua conta Alibaba Cloud ou usuário RAM.
hibernate.connection.password
string
Sim
AccessKey Secret da sua conta Alibaba Cloud ou usuário RAM.
hibernate.connection.autocommit
boolean
Sim
Define se o auto-commit deve ser ativado.
ImportanteO Tablestore não suporta transações. Defina
autocommitcomotrue.hibernate.dialect
string
Sim
Dialeto SQL. Como o SQL do Tablestore é compatível com a sintaxe MySQL, defina este valor como
org.hibernate.dialect.MySQLDialect. -
Carregue o arquivo de configuração do Hibernate para criar um SessionFactory.
SessionFactory factory = new Configuration(). configure("hibernate/hibernate.cfg.xml"). buildSessionFactory();
Etapa 5: Crie uma Session e consultar dados
Crie uma Session a partir do SessionFactory e chame o método get para consultar dados pela chave primária.
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();
Exemplo completo
Consulte uma linha pela chave primária e recupere os valores das colunas. O exemplo a seguir utiliza o valor de chave primária 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").
buildSessionFactory();
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();
}
}
Perguntas frequentes
Não é possível instanciar o tuplizer padrão
Mensagem de erro:
org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
Causa: A dependência javassist está ausente.
Solução:
Adicione a seguinte dependência ao arquivo pom.xml:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.15.0-GA</version>
</dependency>
Unknown column '{columnName}' in 'field list'
Causa: A coluna especificada não existe na tabela de mapeamento SQL.
Solução:
Adicione a coluna como uma coluna predefinida. A sincronização para a tabela de mapeamento SQL ocorre automaticamente.
Inclua a coluna na tabela de mapeamento com uma instrução CREATE TABLE ou ALTER TABLE. Consulte Operações DDL.