hibernate 连接 XuguDB 示例程序
📄字数 6.9K
👁️阅读量 加载中...
虚谷数据库通过实现 Hibernate 的方言接口 Dialect 类,提供了对 Hibernate 框架的功能支持。这些方言类封装了虚谷数据库的特性,使得 Hibernate 能够在虚谷数据库上正确地执行各种数据库操作,包括数据查询、更新、插入、删除以及分页等功能。
本文将介绍对 hibernate-6.6.1 版本的适配情况以及如何连接 XuguDB ,如何使用 xugu-dialect 方言包接入到项目中使用等。
框架名称 | 适配起始版本 | 官网地址 | 源框架下载地址 | XuguDB框架下载 | demo程序地址 |
---|---|---|---|---|---|
hibernate | 3.6.0 | hibernate 官网 | hibernate 源码 | xugu-dialect 版本发布 | xugu-dialect-demo |
提示
其他支持版本可详见版本发布列表
一、使用说明
虚谷对 xugu-dialect
提供了两种获取方式,从而支持 hibernate 框架。源码 install 进行本地 maven 仓库部署
和通过 pom 本地引用 jar 包
两种方式。
1.1 本地 maven 仓库部署
1.1.1 下载源码
从 xugu-dialect下载源码,获取虚谷适配的 hibernate 框架的方言包 xugu-dialect 源码。

1.1.2 使用 IDEA 编译工具打开源码

提示
该项目实际是通过继承 hibernate 框架的 Dialect.java 类的方式适配。
1.1.3 项目 install
项目依赖加载完毕即可使用 maven 插件进行 install。

成功完成 install

1.1.4 添加依赖
修改 pom.xml 文件,添加一下内容:
xml
<dependency>
<groupId>com.xugudb</groupId>
<artifactId>xugu-dialect</artifactId>
<version>6.6.1</version>
</dependency>
1.2 pom 本地引用 jar 包
1.2.1 解压文件
通过上方链接 XuguDB 框架下载
下载压缩包,并解压。

1.2.2 lib 文件夹
到项目根路径下创建 lib 包并且把获取的 jar 包放入 lib 包中,然后在项目的 pom.xml 文件中添加依赖
xml
<dependency>
<groupId>com.xugudb</groupId>
<artifactId>xugu-dialect</artifactId>
<version>6.6.1</version>
<systemPath>${project.basedir}/src/main/resources/lib/xugu-dialect-6.6.1.jar</systemPath>
<scope>system</scope>
</dependency>

1.3 功能支持
1.3.1 数据类型映射
SqlTypes | typeNamePattern |
---|---|
BIT | Binary |
DECIMAL | Numeric( |
CHAR | char($l) |
VARCHAR | Varchar($l) |
LONGVARCHAR | Varchar |
VARBINARY | Binary |
LONGVARBINARY | Blob |
CLOB | Clob |
REAL | Float |
DATE | Date |
TIME | Time |
TIMESTAMP | Timestamp |
1.3.2 功能支持
支持类别 | 详细支持内容 |
---|---|
分页与排序支持 | 支持通过 LIMIT 和 OFFSET 关键字实现分页查询,兼容 FOR UPDATE 子句以确保数据一致性;支持对查询结果的排序,包括对空值的排序规则。 |
序列与标识列支持 | 支持通过 CREATE SEQUENCE 语句创建序列,并提供获取序列值的 SQL 片段;支持自增列,通过 identity(1,1) 定义自增列,并提供获取最后插入的自增列值的 SQL 语句。 |
事务与锁支持 | 支持事务操作,并提供锁功能以确保数据一致性;通过 getForUpdateString 方法生成 FOR UPDATE 子句,实现行级锁定。 |
模式与表操作支持 | 支持模式与表的操作,包括通过 CREATE DATABASE 和 DROP DATABASE 创建和删除数据库;通过 CREATE TABLE 和 DROP TABLE 创建和删除表。 |
外键与约束支持 | 支持外键约束的创建和删除,确保数据的参照完整性;通过 ADD CONSTRAINT 和 DROP CONSTRAINT 创建和删除外键约束;同时支持唯一键约束的删除。 |
注释支持 | 支持表注释和列注释的添加,便于数据字典的维护和理解;通过 COMMENT ON 语句添加表注释和列注释。 |
临时表支持 | 支持通过 CREATE TEMPORARY TABLE 语句创建临时表,并提供本地临时表支持。 |
特殊功能支持 | 支持通过 SELECT uuid() 获取 GUID ;支持处理日期时间字面量,并支持查询序列信息。 |
二、连接示例
2.1 前提条件
- 系统环境
- 计算机已安装 JDK 8 和 Maven。
- 计算机已安装 IntelliJ IDEA。
- 计算机已部署 XuguDB 12.0.0 或有能连接访问的虚谷数据库实例。
- 提前备好 xugu-dialect-6.6.1 的 jar 包。
2.2 maven 依赖
xml
<dependencies>
<!-- hibernate Core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.6.1.Final</version>
</dependency>
<!-- 虚谷数据库方言 -->
<dependency>
<groupId>com.xugudb</groupId>
<artifactId>xugu-dialect</artifactId>
<version>6.6.1</version>
</dependency>
<!-- 虚谷数据库 JDBC 驱动 -->
<dependency>
<groupId>com.xugudb</groupId>
<artifactId>xugu-jdbc</artifactId>
<version>12.3.2</version>
</dependency>
</dependencies>
2.3 hibernate 配置
2.3.1 必要配置
属性 | 值示例 | 说明 |
---|---|---|
hibernate.connection.url | jdbc:xugu://localhost:5138/SYSTEM | 必须连接url |
hibernate.connection.username | SYSDBA | 用户名 |
hibernate.connection.password | SYSDBA | 密码 |
hibernate.connection.driver_class | com.xugu.cloudjdbc.Driver | JDBC驱动类 |
hibernate.dialect | com.xugu.dialect.XuguDialect | 方言类 |
2.3.2 XML 示例配置: hibernate.cfg.xml
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>
<!-- JDBC 连接 -->
<property name="hibernate.connection.driver_class">com.xugu.cloudjdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:xugu://localhost:5138/SYSTEM</property>
<property name="hibernate.connection.username">SYSDBA</property>
<property name="hibernate.connection.password">SYSDBA</property>
<!-- 方言配置 -->
<property name="hibernate.dialect">com.xugu.dialect.XuguDialect</property>
<!-- 最佳实践 -->
<property name="hibernate.hbm2ddl.auto">validate</property>
<property name="hibernate.jdbc.batch_size">25</property>
</session-factory>
</hibernate-configuration>
提示
该文件应该位于:src\main\resources
目录下。
2.4 代码示例
- 在项目根目录的
src\main\java\com\xugu\entity
下创建一个 User 实体类。User.java 文件如下所示:
java
@Entity
@Table(name = "USERT")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String name;
private String password;
private String policy;
private Float organflag;
public float getOrganflag() {
return organflag;
}
public void setOrganflag(float organflag) {
this.organflag = organflag;
}
public User(String id, String name, String password, String policy, float organflag) {
this.id = id;
this.name = name;
this.password = password;
this.policy = policy;
this.organflag = organflag;
}
public User(String name, String password, String policy, Float organflag) {
this.name = name;
this.password = password;
this.policy = policy;
this.organflag = organflag;
}
public String getPolicy() {
return policy;
}
public void setPolicy(String policy) {
this.policy = policy;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", policy='" + policy + '\'' +
", organflag=" + organflag +
'}';
}
}
- 在项目根目录的
src\main\resources\mapper
下创建实体类对应配置类。User.hbm.xml 文件如下所示:
xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.xugu.entity.User" table="USERT">
<id name="id" type="java.lang.String">
<column name="ID" />
<generator class="uuid"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="policy" type="java.lang.String">
<column name="[POLICY]"/>
</property>
<property name="organflag" type="java.lang.Float">
<column name="ORGANFLAG"/>
</property>
</class>
</hibernate-mapping>
- 在项目根目录的
src\main\java\com\xugu\utils
下创建 Utils 工具类,用于获取 SessionFactory 对象和创建 Session 对象。Utils.java 文件如下所示:
java
public class Utils {
static Configuration configuration =null;
static SessionFactory sessionFactory = null;
static
{
// 加载一次配置文件
configuration = new Configuration();
configuration.configure();
// 获取一个sessionFactory
sessionFactory=configuration.buildSessionFactory();
}
// 从连接池获取的
public Session openSession()
{
return sessionFactory.openSession();
}
//获取SessionFactory
public SessionFactory getSessionFactory(){
return sessionFactory;
}
/**
* 关闭session
* @param session
*/
public void closeSession(Session session){
if(session != null) {
session.close();
}
}
/**
* 关闭SeesionFactory
* @param sessionFactory
*/
public void closeSessionFactory(SessionFactory sessionFactory){
if(sessionFactory != null){
sessionFactory.close();
}
}
}
- 在项目根目录的
src\test\java\com\xugu\mapper
下创建单元测试类,分别测试插入、查询、更新和删除操作。HibernateTest.java 文件如下所示:
java
public class HibernateTest {
private static Utils utils;
@Test
public void insertTest(){
//使用sessionFactory对象创建session对象
Session session = utils.openSession();
//手动开启事务
Transaction transaction = session.beginTransaction();
//构建实体对象
User user = new User();
//user.setId(UUID.randomUUID().toString());
user.setName("测试名1");
user.setPassword("123456");
user.setPolicy("hibernate测试333");
user.setOrganflag(2);
log.info("插入的数据为:"+user);
//调用save() 保存数据到表
session.save(user);
//提交事务
transaction.commit();
//期望值
String expected = user.toString();
//实际值
String actual =session.load(User.class,user.getId()).toString();
//使用断言机制判断
Assert.assertEquals(expected,actual);
//关闭资源
session.close();
}
@Test
public void SelectTest(){
Session session = utils.openSession();
//手动开启事务
Transaction transaction = session.beginTransaction();
//指定条件查询
String hql = "from User where name = :name_val";
Query query = session.createQuery(hql);
query.setParameter("name_val", "测试名1");
//执行语句,获取结果集
List<User> list = query.list();
for (User val:list) {
log.info("查询得到的数据为:"+val);
}
//期望值
int expected = 1;
//实际值
int actual = list.size();
//使用断言机制判断
Assert.assertEquals(expected,actual);
//关闭资源
session.close();
}
@Test
public void insertOrUpdateTest() throws SQLException {
//使用sessionFactory对象创建session对象
Session session = utils.openSession();
//手动开启事务
Transaction transaction = session.beginTransaction();
SessionFactory sessionFactory = utils.getSessionFactory();
//从sessionFactory中获取connection
Connection connection = sessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(ConnectionProvider.class).getConnection();
Statement statement = connection.createStatement();
//清空表
String sql1 = "truncate usert";
statement.execute(sql1);
User user = new User(UUID.randomUUID().toString(),"新的测试名","rqerer","reqegfrqtgrr",3.0f);
//插入对象
session.save(user);
//指定条件查询
String sql = "select * from usert where name = '新的测试名'";
NativeQuery<User> query = session.createNativeQuery(sql,User.class);
//获取结果集
List<User> list = query.getResultList();
for (User val:list) {
user = val;
log.info("更新前的数据为:"+user);
}
//更新数据
user.setName("saveOrUpdate测试");
session.saveOrUpdate(user);
//提交事务
transaction.commit();
log.info("更新后的数据"+user);
//期望值
String expected = user.toString();
//实际值
String actual = session.load(User.class,user.getId()).toString();
//使用断言机制判断
Assert.assertEquals(expected,actual);
//关闭资源
session.close();
}
@Test
public void DeleteTest(){
Session session = utils.openSession();
//手动开启事务
Transaction transaction = session.beginTransaction();
String name = "新的测试名";
//hql语句删除数据
String hql = "delete User where NAME = :oldName";
int deleteEntities = session.createQuery(hql)
.setString("oldName",name)
.executeUpdate();
//提交事务
transaction.commit();
//期望值
int expected = 0;
//实际值
int actual = deleteEntities;
//使用断言机制判断
Assert.assertEquals(expected,actual);
//关闭资源
session.close();
}
}
- 在项目根目录的
src\main\resources
下创建 hibernate 框架配置文件。hibernate.cfg.xml 文件如下所示:
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>
<!-- JDBC 连接 -->
<property name="hibernate.connection.driver_class">com.xugu.cloudjdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:xugu://localhost:5138/SYSTEM</property>
<property name="hibernate.connection.username">SYSDBA</property>
<property name="hibernate.connection.password">SYSDBA</property>
<!-- 方言配置 -->
<property name="hibernate.dialect">com.xugu.dialect.XuguDialect</property>
<!-- 最佳实践 -->
<property name="hibernate.hbm2ddl.auto">validate</property>
<property name="hibernate.jdbc.batch_size">25</property>
<mapping resource="mapper/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
提示
hibernate.cfg.xml 文件中需要配置实体类或者实体类对应的xml配置文件。
三、常见问题&解决办法
- 出现报错
ong.hibernate.StaleObjectStateException Create breakpoint: Request processing failed: org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)...
- 保存数据时,当 id 映射为空串时,hibernate 会抛出异常。
- 解决方法:将 id 映射为 null
- 导包需要 hibernate-core 和 xugu-jdbc 同时导入,缺少任何一个都会导致程序抛出异常,启动失败。
- 导入虚谷方言包版本应该匹配应用程序中的 hinbernate-core 版本。不同版本之间,存在差异。