编辑推荐
《Hibernate实战(第2版)》分为五个主要部分。
在第Ⅰ部分“ORM入门”中,我们将探讨对象/关系映射背后的基础。
第Ⅱ部分“映射策略”专注于Java类及其属性,以及它们如何映射到SQL表和列。
第Ⅲ部分“事务性数据处理”完全与使用Hibernate和Java持久化加载与存储数据有关。
第Ⅳ部分“编写查询”将介绍数据查询功能,并详尽讲解查询语言和API。
第Ⅴ部分“构建应用程序”将探讨分层和有会话意识的Java数据库应用程序的设计与实现。
内容简介
持久化——数据在程序实例之外留存的功能——是现代应用程序的核心。Hibernate是流行的Java持久化工具,提供了自动且透明的对象/关系映射,使得在Java应用程序中使用SQL数据库变得轻而易举。
《Hibernate实战(第2版)》通过开发一个将数百个单独示例联系起来的应用程序来探究Hibernate。你将直接深入到Hibernate的富编程模型之中,贯穿映射、查询、抓取策略、事务、会话、缓存以及更多其他内容。书中图文并茂地介绍了数据库设计和优化技术的实践。在《Hibernate实战(第2版)》中,作者详尽介绍了具有Java持久化2.1标准的Hibernate5(JSR338)。所有的示例都已经被更新,以便用于新的Hibernate和JavaEE规范版本。
主要内容
◆对象/关系映射概念
◆有效的数据库应用程序设计
◆全面的Hibernate与Java持久化介绍
◆Java持久化与EJB、CDI、JSF和JAX-RS的集成
◆无与伦比的广度和深度
《Hibernate实战(第2版)》假设读者具有Java的使用经验。
作者简介
ChristianBauer,是Hibernate开发者团队的一员,他是一位培训师和顾问。GavinKing是Hibernate项目的发起者以及最初的Java持久化专家组(JSR220)的一员。他还主导了CDI的
标准化工作(JSR299)。Gavin目前正在创建名为Ceylon的新编程语言。GaryGregory是RocketSoftware的首席软件工程师,他致力于应用程序服务器和遗留系统的集成。他是Manning出版社JUnitinAction和SpringBatchinAction这两《Hibernate实战(第2版)》的合著者,并且是Apache软件基金会项目:Commons、HttpComponents、LoggingServices和Xalan的项目管理委员会的一员。
目录
第Ⅰ部分ORM入门
第1章理解对象/关系持久化1
1.1持久化的定义4
1.1.1关系型数据库4
1.1.2理解SQL5
1.1.3在Java中使用SQL5
1.2范式不匹配7
1.2.1粒度问题8
1.2.2子类型问题10
1.2.3标识问题11
1.2.4与关联相关的问题12
1.2.5数据导航的问题13
1.3ORM和JPA14
1.4本章小结15
第2章开启一个项目17
2.1Hibernate介绍17
2.2使用JPA的“HelloWorld”18
2.2.1配置一个持久化单元18
2.2.2编写一个持久化类20
2.2.3存储和加载消息21
2.3原生Hibernate配置23
2.4本章小结26
第3章域模型和元数据27
3.1CaveatEmptor示例应用程序28
3.1.1一个分层架构28
3.1.2分析业务域29
3.1.3CaveatEmptor域模型30
3.2实现域模型31
3.2.1处理关注点渗漏31
3.2.2透明及自动持久化32
3.2.3编写可持久化类33
3.2.4实现POJO关联36
3.3域模型元数据39
3.3.1基于注解的元数据40
3.3.2应用Bean验证规则42
3.3.3使用XML文件外部化元数据45
3.3.4在运行时访问元数据48
3.4本章小结51
第Ⅱ部分映射策略
第4章映射持久化类55
4.1理解实体和值类型55
4.1.1细粒度域模型55
4.1.2定义应用程序概念56
4.1.3区分实体和值类型57
4.2映射具有标识的实体58
4.2.1理解Java标识和相等性58
4.2.2第一个实体类和映射59
4.2.3选择一个主键60
4.2.4配置键生成器61
4.2.5标识符生成器策略63
4.3实体映射选项66
4.3.1控制名称66
4.3.2动态SQL生成69
4.3.3让实体不可变69
4.3.4将一个实体映射到子查询70
4.4本章小结71
第5章映射值类型73
5.1映射基本属性73
5.1.1重写基本属性的默认设置74
5.1.2自定义属性访问75
5.1.3使用派生属性77
5.1.4转换列值77
5.1.5生成的以及默认的属性值78
5.1.6时序属性79
5.1.7映射枚举80
5.2映射可嵌入组件80
5.2.1数据库架构81
5.2.2让类可嵌入81
5.2.3重写嵌入属性84
5.2.4映射嵌套的可嵌入组件85
5.3使用转换器映射Java和SQL类型87
5.3.1内置类型87
5.3.2创建自定义JPA转换器92
5.3.3使用UserTypes扩展Hibernate98
5.4本章小结104
第6章映射继承关系105
6.1每个带有隐式多态的具体类使用一个表105
6.2每个带有联合的具体类使用一个表107
6.3每个类层次结构使用一个表109
6.4每个带有联结的子类使用一个表112
6.5混合继承策略115
6.6可嵌入类的继承117
6.7选择一种策略119
6.8多态关联120
6.8.1多态多对一关联121
6.8.2多态集合123
6.9本章小结124
第7章映射集合和实体关联125
7.1集、包、列表及值类型映射125
7.1.1数据库架构126
7.1.2创建和映射一个集合属性126
7.1.3选择集合接口127
7.1.4映射集128
7.1.5映射标识符包129
7.1.6映射列表130
7.1.7映射一个映射132
7.1.8排列和排序集合132
7.2组件集合135
7.2.1组件实例的相等性136
7.2.2组件集138
7.2.3组件包139
7.2.4组件值的映射141
7.2.5作为映射键的组件142
7.2.6可嵌入组件中的集合143
7.3映射实体关联144
7.3.1最简单的可能关联145
7.3.2让其变成双向的146
7.3.3级联状态147
7.4本章小结153
第8章高级实体关联映射155
8.1一对一关联155
8.1.1共享主键156
8.1.2外主键生成器158
8.1.3使用一个外键联结列161
8.1.4使用一个联结表162
8.2一对多关联164
8.2.1考虑一对多包164
8.2.2单向和双向列表映射166
8.2.3具有联结表的可选一对多168
8.2.4可嵌入类中的一对多关联169
8.3多对多和三元关联171
8.3.1单向和双向多对多关联172
8.3.2具有中间实体的多对多关联173
8.3.3具有组件的三元关联177
8.4具有映射的实体关联180
8.4.1具有属性键的一对多关联180
8.4.2键/值三元关系181
8.5本章小结182
第9章复杂和遗留模式185
9.1改进数据库架构186
9.1.1添加辅助数据库对象186
9.1.2SQL约束189
9.1.3创建索引194
9.2处理遗留键195
9.2.1映射一个自然主键195
9.2.2映射一个组合主键196
9.2.3组合主键中的外键198
9.2.4引用组合主键的外键201
9.2.5引用非主键的外键202
9.3将属性映射到辅助表203
9.4本章小结204
第Ⅲ部分事务性数据处理
第10章管理数据207
10.1持久化生命周期207
10.1.1实体实例状态208
10.1.2持久化上下文209
10.2EntityManager接口211
10.2.1规范的工作单元211
10.2.2使数据持久化212
10.2.3检索和修改持久化数据213
10.2.4得到一个引用215
10.2.5让数据变成瞬时的216
10.2.6刷新数据217
10.2.7复制数据217
10.2.8在持久化上下文中缓存218
10.2.9刷新持久化上下文220
10.3处理分离的状态221
10.3.1分离实例的标识221
10.3.2实现相等性方法223
10.3.3分离实体实例225
10.3.4合并实体实例226
10.4本章小结227
第11章事务和并发229
11.1事务的要素229
11.1.1ACID属性230
11.1.2数据库和系统事务230
11.1.3使用JTA的编程式事务230
11.1.4处理异常232
11.1.5声明式事务分界234
11.2控制并发访问234
11.2.1理解数据库级别的并发235
11.2.2乐观并发控制239
11.2.3显式悲观锁245
11.2.4避免死锁248
11.3非事务性数据访问249
11.3.1在自动提交模式中读取数据250
11.3.2对修改进行排队251
11.4本章小结253
第12章抓取计划、策略和配置文件255
12.1延迟加载和急加载256
12.1.1理解实体代理256
12.1.2延迟持久化集合260
12.1.3使用拦截进行延迟加载262
12.1.4关联和集合的急加载264
12.2选择一个抓取策略266
12.2.1n+1查询问题266
12.2.2笛卡尔积问题267
12.2.3批量预抓取数据270
12.2.4使用子查询预抓取集合272
12.2.5使用多个SELECT进行急抓取273
12.2.6动态急抓取274
12.3使用抓取配置文件275
12.3.1声明Hibernate抓取配置文件276
12.3.2使用实体图277
12.4本章小结281
第13章数据过滤283
13.1级联状态迁移284
13.1.1可用的级联选项284
13.1.2传递式分离与合并285
13.1.3级联刷新287
13.1.4级联复制289
13.1.5启用全局传递式持久化290
13.2侦听和拦截事件290
13.2.1JPA事件侦听器和回调291
13.2.2实现Hibernate拦截器294
13.2.3核心事件系统298
13.3使用HibernateEnvers进行
审计和版本控制299
13.3.1启用审计日志300
13.3.2创建审计追踪301
13.3.3找出版本301
13.3.4访问历史数据303
13.4动态数据过滤器305
13.4.1定义动态过滤器306
13.4.2应用过滤器306
13.4.3启用过滤器307
13.4.4过滤集合访问308
13.5本章小结309
第IV部分编写查询
第14章创建和执行查询313
14.1创建查询314
14.1.1JPA查询接口314
14.1.2类型化查询结果316
14.1.3Hibernate的查询接口316
14.2准备查询318
14.2.1防止SQL注入攻击318
14.2.2绑定命名参数318
14.2.3使用定位参数320
14.2.4对大结果集分页320
14.3执行查询322
14.3.1列示所有结果322
14.3.2得到单个结果322
14.3.3滚动数据库游标323
14.3.4遍历一个结果325
14.4命名和外部化查询326
14.4.1调用一个命名查询326
14.4.2在XML元数据中定义查询326
14.4.3使用注解定义查询327
14.4.4编程式定义命名查询328
14.5查询提示329
14.5.1设置一个超时时长330
14.5.2设置刷新模式330
14.5.3设置只读模式331
14.5.4设置一个抓取大小331
14.5.5设置一个SQL注释331
14.5.6命名的查询提示332
14.6本章小结333
第15章查询语言335
15.1选择336
15.1.1指定别名和查询根336
15.1.2多态查询337
15.2限制338
15.2.1比较表达式339
15.2.2使用集合的表达式344
精彩书摘
1.1持久化的定义
几乎所有的应用程序都需要持久化数据。持久化是应用程序开发中的基本概念之一。如果一个信息系统在关机时不保存数据,则该系统就没什么实际用途。对象持久化意味着个体对象可以比应用程序进程存在得更久;它们可以保存到数据存储并在以后的某个时点重建。当我们谈论Java中的持久化时,通常谈论的是使用SQL在一个数据库中映射和存
储对象实例。首先我们简要介绍一下该技术以及如何在Java中使用它。了解这一信息基础,随后我们就可以继续探讨持久化以及如何在面向对象应用程序中实现它。
1.1.1关系型数据库
就像大多数其他软件工程师一样,你可能已经使用过SQL和关系型数据库;许多软件工程师每天都在处理这样的系统。关系型数据库管理系统具有基于SQL的应用编程接口;因此,我们将如今的关系型数据库产品称为SQL数据库管理系统(DBMS),或者我们在谈论特定系统时将其称为SQL数据库。关系技术是人们所熟知的技术,而这也成为许多组织选择它的充足理由。但要说它是唯一的理由,恐怕就不太尊重事实了。关系型数据库的应用已经根深蒂固了,因为它们对于数据管理来说是一种极具灵活性并且强健的方式。归因于对关系数据模型的深入研究的理论基础,关系型数据库可以保障和保护所存储数据的完整性,这是其众多可取特性之一。你可能对E.F.Codd于四十多年前提出的关系模型很熟悉,即ARelationalModelofDataforLargeSharedDataBanks(Codd,1970年)。有一篇最近的摘要值得一读,其中专注于SQL,这就是C.J.Date的SQLandRelationalTheory(Date,2009年)。关系型DBMS并非特定于Java,也不是特定于某特殊应用程序的一个SQL数据库。
这一重要原则称为数据独立性。换句话说,我们怎么强调如下重要事实都不过分:数据的生命周期比任何应用程序都要长久。关系技术提供了在不同应用程序或者同一整体系统的不同部分(比如数据录入应用程序和报告应用程序)之间共享数据的方法。关系技术是许多异构系统和技术平台的通用标准。因此,关系数据模型通常是业务实体的常用企业级表示方式的基础。
在我们更详细地探究SQL数据库的实践方面之前,必须提及一个重要问题:即便作为关系型推向市场,但一个仅仅提供SQL数据语言接口的数据库系统并非真正的关系型数据库,并且在许多方面来说甚至与其原始概念都不相符。这自然而然会导致混淆。SQL从业
……
前言/序言
《Hibernate实战(第2版)》既是关于Hibernate和Java持久化的一本指南,也是一本参考资料。如果你才开始接触Hibernate,我们建议你从《Hibernate实战(第2版)》第1章开始阅读,并且使用第2章的“HelloWorld”教程开始编码。如果你已经使用过较早的Hibernate版本,那么应该快速阅读前两章以便得到一个概览,然后跳到第3章的中间部分。
路线图
《Hibernate实战(第2版)》分为五个主要部分。
在第Ⅰ部分“ORM入门”中,我们将探讨对象/关系映射背后的基础。我们将演练亲身实践的指南,以便让你开始处理自己的首个Hibernate项目。我们将介绍用于域模型的Java应用程序设计,以及用于创建对象/关系映射元数据的选项。
第Ⅱ部分“映射策略”专注于Java类及其属性,以及它们如何映射到SQL表和列。我们将探究Hibernate和Java持久化中的所有基本和高级映射选项。我们将介绍如何处理继承、集合以及复杂类关联。最后,我们要探讨遗留数据库模式的集成以及特别难处理的一些映射策略。
第Ⅲ部分“事务性数据处理”完全与使用Hibernate和Java持久化加载与存储数据有关。我们将介绍编程接口、如何编写事务性应用程序,以及Hibernate如何才能最有效地从数据库加载数据。
第Ⅳ部分“编写查询”将介绍数据查询功能,并详尽讲解查询语言和API。在这一部分中,并非所有章节都是以指南的风格来编写的;我们期望你在构建一个应用程序以及为特定查询问题查找解决方案时经常浏览《Hibernate实战(第2版)》的这一部分。
第Ⅴ部分“构建应用程序”将探讨分层和有会话意识的Java数据库应用程序的设计与实现。我们要探讨用于Hibernate的最常见设计模式,比如数据访问对象(DataAccessObject,DAO)。你会看到如何才能轻松测试自己的Hibernate应用程序,并且学习在Web和客户端/服务器应用程序中使用对象/关系映射软件时,通常有哪些相关的最佳实践。
读者对象
《Hibernate实战(第2版)》的读者应该具备基本的面向对象软件开发知识,并且应该在实践中已经应用过这一知识。为了理解应用程序示例,你应该熟悉Java编程语言以及统一建模语言。我们的主要目标读者由使用基于SQL数据库系统的Java开发人员构成。我们将介绍如何通过使用ORM大幅提高你的生产效率。如果你是一位数据库开发人员,那么《Hibernate实战(第2版)》可将你引入面向对象软件开发。如果你是一位数据库管理员,那么你有兴趣了解ORM如何影响性能,以及如何才能调整SQL数据库管理系统和持久化层的性能来实现性能目标。由于数据访问是大多数Java应用程序中的瓶颈,因此《Hibernate实战(第2版)》密切关注性能问题。许多DBA都对于将性能委托给工具生成的SQL代码这一点感到紧张,这是可以理解的;我们力图缓解那些不安,并且突出介绍应用程序不应该使用工具托管的数据访问的用例。你可能会欣慰地发现,我们并没有宣称ORM是每一个问题的最佳解决方案。
代码规范
《Hibernate实战(第2版)》提供了丰富示例,其中包括所有的Hibernate应用程序构件:Java代码、Hibernate配置文件以及XML映射元数据文件。代码清单或文本中的源代码都使用了固定宽度的字体格式,以便将其与普通文本区分开来。此外,文本中的Java方法名称、组件参数、对象属性以及XML元素和属性也使用了固定宽度的字体格式。Java、HTML和XML都会很冗长。在许多用例中,原始的源代码已经被重新格式化;我们在《Hibernate实战(第2版)》中已经添加换行符和重新处理的行首缩进来调节可用的页面空间。在极少的用例中,即便如此也是不够的,因而清单包含了续行符标记(?)。此外,当文本中描述了代码时,源代码中的注释通常就会从清单中移除。有些源代码清单伴随着代码注解,以突出重要的概念。
源代码下载
Hibernate是基于宽松GNU公共许可来发布的一个开源项目。Hibernate网站hibernate上提供了以源代码或二进制格式下载Hibernate包的指示。http://jpwh.org/上提供了《Hibernate实战(第2版)》中所有示例的源代码。
你也可以从《Hibernate实战(第2版)》封底的二维码下载《Hibernate实战(第2版)》中的示例代码。
作者在线
购买《Hibernate实战(第2版)》就可以免费访问由Manning出版社运营的私有网络论坛,在该论坛中你可以发表与《Hibernate实战(第2版)》有关的评论,提出技术问题,并且接受来自作者及其他用户的帮助。要访问该论坛并订阅它,请将你的网络浏览器导航到manning.com/books/java-persistence-with-hibernate-second-edition。这个页面提供了与注册之后如何访问该论坛、可以得到哪些帮助,以及该论坛执行的规则有关的信息。
Manning向我们的读者承诺,将提供读者之间以及读者与作者之间可以进行有意义对话的场所。就作者而言,无法确保某种程度的参与度,他们对于该论坛的贡献仍然是自愿(且无偿)的。我们建议你尝试向作者提出具有一些挑战性的问题,以便他们对你的问题深感兴趣!只要《Hibernate实战(第2版)》还在印刷,那么作者在线论坛以及之前探讨的记录就可以从出版者的网站上访问到。