写点什么

为 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:28816

评论

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

深入探究Flink:实时处理与批量处理的完美结合

xfgg

Java flink 6 月 优质更文活动

Jogger慢跑者链游系统开发NFT技术

薇電13242772558

NFT 链游

OpenHarmony 4.0 Beta1发布,邀您体验

OpenHarmony开发者

OpenHarmony

【体验有奖】玩转 AIGC,函数计算 x 通义千问预体验,一键部署AI应用赢Airpods

Serverless Devs

函数计算FC AIGC

10分钟了解Kubernetes网络

俞凡

架构 Kubernetes 云原生

2022百度ESG报告发布:年度答卷展现安全信任承诺

百度安全

探究核心技术&最佳实践,云原生OLAP论坛火热开启!

阿里云大数据AI技术

云原生

深度学习应用篇-计算机视觉-目标检测[4]:综述、边界框bounding box、锚框(Anchor box)、交并比、非极大值抑制NMS、SoftNMS

汀丶人工智能

人工智能 深度学习 计算机视觉 目标检测 6 月 优质更文活动

NFTScan 成为 CMC 官方 NFT 数据合作伙伴

NFT Research

crypto NFT

“变脸的秘密”!直播源码app开发技术特效功能的实现

山东布谷科技

源码剖析 APP开发 软件开发、 源码搭建 直播源码

用户组是什么意思?怎么容易理解?有什么作用?

行云管家

运维 权限 用户组

赋能生态合作 共话数字创新 | 2023开放原子全球开源峰会软硬协同开源分论坛即将启幕

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 软硬协同开源

浅谈微服务异步解决方案

Java 微服务 异步

来了解Amazon CodeWhisperer的强大吧

初学者

云计算 亚马逊 亚马逊云

大厂面试必备!字节大佬刷Leetcode总结的算法笔记

Java 数据结构 算法 LeetCode

Openjob 1.0.2 重磅发布,新一代分布式任务调度框架

stelin

分布式架构 Java 分布式

等待还是转行?GitHub爆赞的10W字Java八股文,你没得选择

Java java面试 Java八股文 Java面试题 Java面试八股文

Amazon CodeWhisperer代码提示体验本文带你了解

我叫于豆豆吖.

云计算 亚马逊 亚马逊云

AI老师的作者:17岁的高中生,可能是你想要孩子成为的样子

无人之路

AI 教育 ChatGPT

问道价值互联网,区块链的下一个十年 | 2023开放原子全球开源峰会区块链分论坛即将启幕

开放原子开源基金会

区块链 开源 开放原子全球开源峰会

让ChatGPT来写今年的高考作文,能得几分?

楚少AI

ChatGPT4 2023高考 ChatGPT写作

瞄准“量效”难题,百度营销创新推出大健康线索营销解决方案-医效通

说山水

深入了解mock.js,打造出类似真实数据的模拟数据

Apifox

程序员 前端 前端开发 API Mock

咸阳有没有等保测评机构?在哪里?怎么联系?

行云管家

等保 等保测评 等保测评机构 咸阳

揭秘阿里云Flink智能诊断利器——Fllink Job Advisor

阿里云大数据AI技术

大数据 flink 企业号 6 月 PK 榜

2023世界人工智能大会“AI生成与垂直大语言模型”论坛重磅来袭!

NLP资深玩家

打造高可用的微服务架构:Spring Cloud 的优化与实践

xfgg

Java 微服务 SpringCloud 6 月 优质更文活动

什么是双机热备技术?华为和思科如何实现双机热备?

Java 网络 双机热备

最强AIGC实战应用速成指南来了!14天掌握核心技术

飞桨PaddlePaddle

人工智能 深度学习 百度飞桨

深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍

汀丶人工智能

人工智能 深度学习 计算机视觉 图像分类 6 月 优质更文活动

百度离线资源治理

百度Geek说

数据库 大数据 离线 企业号 6 月 PK 榜 6 月 优质更文活动

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