返回介绍

第11章 使用对象-关系映射持久化数据

发布于 2024-08-17 00:45:49 字数 1737 浏览 0 评论 0 收藏 0

本章内容:

使用Spring和Hibernate

借助上下文Session,编写不依赖于Spring的Repository

通过Spring使用JPA

借助Spring Data实现自动化的JPA Repository

小时候,骑自行车是一件很有趣的事情,对吧?在清晨,我们骑车上学。放学后,我们游逛到朋友家。当天色渐晚之时,在父母的呼喊声中,我们骑车回家。那些日子真的很有意思!

后来,随着慢慢长大,现在我们所需要的不仅仅是一辆自行车了。有时,我们需要走很远的路去上班或需要装载一些生活用品,还有可能接送孩子去上足球课。如果生活在得克萨斯州的话,我们还必须需要一台空调。我们的需求超出了自行车的功能范围。

在数据持久化的世界中,JDBC就像自行车。对于份内的工作,它能很好地完成并且在一些特定的场景下表现出色。但随着应用程序变得越来越复杂,对持久化的需求也变得更复杂。我们需要将对象的属性映射到数据库的列上,并且需要自动生成语句和查询,这样我们就能从无休止的问号字符串中解脱出来。此外,我们还需要一些更复杂的特性:

延迟加载(Lazy loading):随着我们的对象关系变得越来越复杂,有时候我们并不希望立即获取完整的对象间关系。举一个典型的例子,假设我们在查询一组PurchaseOrder对象,而每个对象中都包含一个LineItem对象集合。如果我们只关心PurchaseOrder的属性,那查询出LineItem的数据就毫无意义。而且这可能是开销很大的操作。延迟加载允许我们只在需要的时候获取数据。

预先抓取(Eager fetching):这与延迟加载是相对的。借助于预先抓取,我们可以使用一个查询获取完整的关联对象。如果我们需要PurchaseOrder及其关联的LineItem对象,预先抓取的功能可以在一个操作中将它们全部从数据库中取出来,节省了多次查询的成本。

级联(Cascading):有时,更改数据库中的表会同时修改其他表。回到我们订购单的例子中,当删除Order对象时,我们希望同时在数据库中删除关联的LineItem。

一些可用的框架提供了这样的服务,这些服务的通用名称是对象/关系映射(object-relational mapping,ORM)。在持久层使用ORM工具,可以节省数千行的代码和大量的开发时间。ORM工具能够把你的注意力从容易出错的SQL代码转向如何实现应用程序的真正需求。

Spring对多个持久化框架都提供了支持,包括Hibernate、iBATIS、Java数据对象(Java Data Objects,JDO)以及Java持久化API(Java Persistence API,JPA)。与Spring对JDBC的支持那样,Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务:

支持集成Spring声明式事务;

透明的异常处理;

线程安全的、轻量级的模板类;

DAO支持类;

资源管理。

本章没有足够的篇幅介绍Spring支持的全部ORM框架。其实这并不会有什么问题,因为Spring对不同ORM解决方案的支持是很相似的。一旦掌握了Spring对某种ORM框架的支持后,你可以轻松地切换到另一个框架。

在本章中,我们将会看到Spring如何与最常用的两种ORM方案集成:Hibernate和JPA。同时还会通过Spring Data JPA了解一下Spring Data项目。借助这种方式,我们不仅可以学习到如何借助Spring Data JPA移除JPA Repository中的样板式代码,还能为下一章的如何将Spring Data用于无模式的存储打下基础。

让我们先来看看Spring是如何为Hibernate提供支持的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文