写点什么

为 Cloud Spanner 引入 Hibernate ORM 以便使用数据库

  • 2020-05-26
  • 本文字数:2695 字

    阅读完需:约 9 分钟

为 Cloud Spanner 引入 Hibernate ORM 以便使用数据库

当您采用新的数据库技术时,如何学习新的 SQL 方言或编写新的数据持久层逻辑,都是需要考虑的事项。我们希望尽可能简化这一流程。对于此类工作,Hibernate 实际上已成为 Java 项目的标准对象关系映射 (ORM) 解决方案。Hibernate 支持所有主要关系型数据库,并支持 Spring Data JPA 等功能更为强大的 ORM 工具。


我们已开发出全新开源 Cloud Spanner Dialect for Hibernate ORM,让用户能够更加轻松地采用 Cloud Spanner。现在,您可以通过 Hibernate 所习惯使用的数据持久层处理获得 Cloud Spanner 的优势:即可扩展性和关系数据库语义。这样一来,您可以将现有应用程序迁移到云中,或使用 Hibernate 兼容环境的常用 API(例如 JPA、Spring Data JPA、Microprofile 和 Quarkus)编写新的应用。


Hibernate ORM 提供以下两大主要优势,可帮助解决采用新数据库技术时面临的挑战:跨数据库的可移植性,以及创建-读取-更新-删除 (CRUD) 逻辑的易编写性。借助这些优势,开发者的工作效率得以提高,云数据库的采用速度也得到提升。


如需了解详细信息,请查看我们的文档、git 代码库,或试用 Codelab。

如何使用 Hibernate 和 Cloud Spanner 编写 Java 应用

接下来,我们将为您简要介绍如何编写使用 Hibernate 访问 Cloud Spanner 的 Java 应用。具体步骤与您在 Codelab 中看到的类似。我们将创建一个应用,将音乐人及其专辑存储在 Cloud Spanner 中。虽然这只是一个基本的 Hibernate 示例,但请记住,此方法也适用于由 Hibernate 提供支持的 JPA 型系统。


我们需要适用于 Hibernate 的 Cloud Spanner 方言,开源 Cloud Spanner JDBC 驱动程序,以及 Hibernate 核心。我们先将这些依赖项添加至应用。


pom.xml


 <dependencies>
复制代码


<dependency>  <groupId>com.google.cloud</groupId>  <artifactId>google-cloud-spanner-hibernate-dialect</artifactId>
复制代码


  <version>1.0.0</version>
复制代码


</dependency>
<!-- JDBC Driver --><dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-spanner-jdbc</artifactId> <version>1.11.0</version>
复制代码


  </dependency>
复制代码


<!-- Hibernate --><dependency>  <groupId>org.hibernate</groupId>  <artifactId>hibernate-core</artifactId>  <version>5.4.9.Final</version></dependency>
复制代码


src/main/resources/hibernate.cfg.xml


<hibernate-configuration>
复制代码


Hibernate 也需要知道如何连接到 Cloud Spanner 实例以及使用哪种方言。于是,我们指示 Hibernate 使用适合 SQL 语法的 SpannerDialect、Cloud Spanner JDBC 驱动程序,以及带有数据库坐标的 JDBC 连接字符串。


src/main/resources/hibernate.properties


hibernate.dialect=com.google.cloud.spanner.hibernate.SpannerDialect
hibernate.connection.driver_class=com.google.cloud.spanner.jdbc.JdbcDriver
hibernate.connection.url=jdbc:cloudspanner:/projects/{INSERT_PROJECT_ID}/instances/{INSERT_INSTANCE_ID}/databases/{INSERT_DATABASE_ID}
# auto-create and update DB schemahibernate.hbm2ddl.auto=update
复制代码


我们将使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量中的服务帐号 JSON 文件,或使用通过“gcloud auth application-default login”命令配置的应用默认凭据来确保完成身份验证凭据设置。


现在我们准备就绪,可以编写一些代码。


我们将定义两个普通的旧 Java 对象 (POJO),其将映射到 Cloud Spanner 中的两个表格(Singer 和 Album)。Album 将与 Singer 建立 @ManyToOne 关系。我们也可以将 Singers 映射到带有 @OneToMany 注解的 Albums 列表,但在此示例中,我们不希望每次需要从数据库中获取歌手时都加载所有专辑。


由于没有现成的数据库架构,我们添加了 hibernate.hbm2ddl.auto=update 属性,以便让 Hibernate 于首次运行应用时在 Cloud Spanner 中创建两个表格。


src/main/java/demo/Application.java


 @Entityclass Singer {  @Id  @GeneratedValue
复制代码


@Type(type = “uuid-char”)


  UUID singerId;
String firstName;
String lastName;
复制代码


@Temporal(TemporalType.DATE)


  Date birthDate;}
复制代码


@Entity


class Album {


@Id


@GeneratedValue


@Type(type = “uuid-char”)


UUID albumId;


@ManyToOne


Singer singer;


String albumTitle;


}


此外,还需要为每个实体添加无参数的构造函数 hashCode() 和 equals(),因为 Hibernate 需要这些函数。您可在完整示例中查看全部操作。


此外,在此示例中,我们将使用自动生成的 UUID 作为主键。这是 Cloud Spanner 中的首选 ID 类型,因为其避开了系统按照键范围在服务器之间划分数据时的热点。也可使用单调递增的整数键,但性能可能会下降。


配置好所有内容并定义了实体对象之后,我们即可开始写入数据库。


创建 Hibernate Session。


src/main/java/demo/Application.java


StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata()        .buildSessionFactory();Session session = sessionFactory.openSession();
复制代码


现在,将一些数据写入 Cloud Spanner。


src/main/java/demo/Application.java


session.beginTransaction();
复制代码


Singer singerMelissa = new Singer(“Melissa”, “Garcia”, makeDate(“1981-03-19”));


Album albumGoGoGo = new Album(singerMelissa, “Go, Go, Go”);


session.save(singerMelissa);


session.save(albumGoGoGo);


session.save(new Singer(“Russell”, “Morales”, makeDate(“1978-12-02”)));


session.save(new Singer(“Jacqueline”, “Long”, makeDate(“1990-07-29”)));


session.save(new Singer(“Dylan”, “Shaw”, makeDate(“1998-05-02”)));


session.getTransaction().commit();


此时,如果您转到 Cloud Spanner 控制台并查看数据库中“歌手”和“专辑”表格的数据,则会看到以下内容:




能够在 Cloud Console 中轻松浏览数据库表很好,但我们还希望能够在自己的应用中查询这些数据库表。因此最后,我们来使用 Hibernate 查询一些数据。请注意,我们使用的是 HQL,其可在各种 Hibernate 方言之间移植,而不仅仅是 Cloud Spanner。


src/main/java/demo/Application.java


 List<Singer> singers =
复制代码


session.createQuery("from Singer where birthDate >= '1990-01-01'").list();
复制代码


Listalbums = session.createQuery(“from Album”).list();


最后,请务必先关闭 Hibernate 资源,然后再关闭应用。


src/main/java/demo/Application.java


session.close();sessionFactory.close();
复制代码


2020-05-26 12:28873

评论

发布
暂无评论
发现更多内容

Wallys/industrial Wireless AP/IPQ6018,IPQ4019,IPQ4029,802.11ax,802.11ac,outdoor ap

wallys-wifi6

我,AI博士生,在线众筹研究主题

OneFlow

研究

LeetCode-94. 二叉树的中序遍历(java)

bug菌

Leet Code 7月月更

wallys/industrial Wireless AP/IPQ4019 IPQ4029 ,802.11ac /VSSupport IPQ6018 IPQ4019 IPQ4029 802.11ax 802.11ac

wallys-wifi6

阿里云技术专家杨泽强:弹性计算云上可观测能力构建

阿里云弹性计算

DevOps 可观测性 CI/CD metrics

常用 CSS 代码片段集合,建议收藏

南城FE

CSS 前端 CSS语法 7月月更

ES6 类聊 JavaScript 设计模式之结构型模式

devpoint

JavaScript 设计模式 桥接模式 适配器模式 7月月更

【LeetCode】使数组可以被整除的最少删除次数Java题解

Albert

LeetCode 7月月更

高度关注!2022 开放原子开源峰会最新议程一览

kk-OSC

开源 开放原子全球开源峰会

数字化时代,如何利用区块链技术赋能乳制品企业?

旺链科技

区块链 产业区块链 乳制品

java零基础入门-java8新特性(中篇)

喵手

Java 7月月更

源启数字化:既有模式,还是开源创新?|砺夏行动

OneFlow

活动

执掌英国工程技术学会13载,范纳杰正式退休

E科讯

特斯拉为何使用.NET Core技术框架?

博文视点Broadview

行业分析| 物流对讲

anyRTC开发者

人工智能 音视频 物流 调度 快对讲

git clone出错--必看贴

坚果

git Mac git 学习 7月月更

Qt|控制QScrollBar显示位置

中国好公民st

qt 7月月更

数仓基本概念解析

五分钟学大数据

数据仓库 7月月更

wallys/industrial Wireless AP/industrial Wireless AP

wallys-wifi6

IPQ4019/IPQ4029

有一说一,要搞明白优惠券架构是如何演化的,只需10张图!

程序员小毕

Java 编程 程序员 架构 面试

执掌英国工程技术学会 13 载,范纳杰正式退休

E科讯

P9力荐!阿里巴巴最新出品776页JDK源码+并发核心原理解析小册

程序员小毕

Java 程序员 面试 程序人生 jdk源码

SAP ABAP 解析 excel 文件的函数 TEXT_CONVERT_XLS_TO_SAP 单步执行分析

汪子熙

Cloud SAP abap Netweaver 7月月更

博物馆数字化——数字藏品app开发

开源直播系统源码

区块链数字藏品 数字藏品软件开发

云原生 SIG 直播:关于 cni 与 hybridnet 核心技术分享 | 第 35 期

OpenAnolis小助手

开源 云原生 直播 sig 龙蜥大讲堂

Java RMI

沃德

Java 程序员 7月月更

即刻报名|如何降低云上数据分析成本?

Kyligence

数据分析 智能多维数据库

为 Cloud Spanner 引入 Hibernate ORM 以便使用数据库_开源_Mike Eltsufin_InfoQ精选文章