第1章 对象-关系映射概述 1
1.1 分层体系结构 1
1.1.1 层次结构 2
1.1.2 分层架构特点 4
1.1.3 Java数据持久层设计 6
1.2 软件设计模型 10
1.2.1 概念模型 10
1.2.2 数据模型 11
1.2.3 域模型 13
1.3 对象-关系映射技术背景 22
1.3.1 关系数据库操作 24
1.3.2 数据持久化 25
1.3.3 直接使用JDBC的弊端 28
1.3.4 对象-关系映射基本概念 28
1.4 对象-关系映射工具 30
1.4.1 Hibernate 31
1.4.2 JDO 32
1.4.3 iBATIS 32
1.5 小结 33
第2章 快速上手 34
2.1 准备工作 34
2.2 Hibernate起步 35
2.2.1 开发环境准备 35
2.2.2 创建持久化类 37
2.2.3 创建对象-关系映射文件 38
2.2.4 创建Hibernate配置文件 39
2.2.5 用Hibernate持久化数据 41
2.2.6 加载并存储对象 43
2.3 Hibernate体系结构 46
2.3.1 结构及构成 46
2.3.2 Hibernate基本API 48
2.3.3 Configuration 48
2.3.4 SessionFactory 48
2.3.5 Session 48
2.3.6 SessionFactory的配置 48
2.4 Hibernate Tools 53
2.4.1 Hibernate基本开发环境 53
2.4.2 在Ant环境中使用Hibernate Tools 54
2.4.3 在Eclipse中使Hibernate Tools 58
2.5 小结 64
第3章 对象/关系数据库映射 65
3.1 映射定义 65
3.1.1 映射文件概要 65
3.1.2 映射文件结构 66
3.2 映射文件生成 69
3.2.1 使用XDoclet生成映射文件 69
3.2.2 安装Doclipse插件 70
3.2.3 编写Java类对象 71
3.2.4 编写类对象的XDoclet Hibernate标签 74
3.2.5 执行Ant Task生成配置文件 80
3.3 对象标识符 82
3.3.1 内置对象标识符 83
3.3.2 increment策略 84
3.3.3 高/低位算法生成策略 86
3.3.4 标识字段和序列 89
3.3.5 自定义对象标识符 91
3.4 映射类型 95
3.4.1 基本映射类型 95
3.4.2 自定义映射类型 98
3.5 小结 101
第4章 关联关系与组件 102
4.1 关联关系 102
4.2 一对一关联 104
4.2.1 使用主键关联 104
4.2.2 使用外键关联 109
4.3 一对多关联 112
4.3.1 单向关联 112
4.3.2 最佳实践——提高删除性能 118
4.3.3 双向关联 119
4.4 多对多关联 122
4.5 检索策略 127
4.5.1 检索策略 128
4.5.2 多对一 129
4.5.3 一对一 132
4.5.4 一对多/多对多 134
4.6 组件映射 137
4.7 传播性持久化 141
4.8 小结 142
第5章 集合类映射 143
5.1 集合 143
5.1.1 Java中的集合 143
5.1.2 Hibernate中的集合 144
5.2 映射Map 145
5.2.1 Java中的Map 146
5.2.2 映射Map 150
5.3 映射Set 157
5.3.1 Java中的Set 157
5.3.2 映射Set 159
5.4 映射List 162
5.4.1 Java中的List 163
5.4.2 映射List 164
5.5 映射Bag 172
5.5.1 映射Bag 172
5.5.2 映射idbag 176
5.6 集合排序 179
5.6.1 数据库排序 179
5.6.2 内存排序 181
5.7 小结 183
第6章 继承映射 184
6.1 继承映射 184
6.2 继承映射的几种策略 188
6.2.1 每个类继承结构一张表 188
6.2.2 每个子类一张表 195
6.2.3 每个子类一张表,使用辨别标志 200
6.2.4 混合使用“每个类继承结构一张表”和“每个子类一张表” 203
6.2.5 每个具体类一张表 207
6.2.6 每个具体类一张表,使用隐式多态 211
6.3 小结 218
第7章 操作持久化对象 219
7.1 持久对象的生命周期 219
7.1.1 瞬时对象 220
7.1.2 持久对象 221
7.1.3 脱管对象 224
7.1.4 区分持久对象 225
7.1.5 equals()和hashCode() 228
7.2 理解Session清理 232
7.2.1 Session缓存 232
7.2.2 Session清理 235
7.2.3 深入Session清理机制 237
7.3 Session操作对象的方法 239
7.3.1 save() 240
7.3.2 get() 242
7.3.3 update() 243
7.3.4 delete() 245
7.3.5 saveOrUpdate() 246
7.4 传播性持久化 247
7.5 小结 251
第8章 Hibernate查询 252
8.1 Hibernate的查询方式 252
8.1.1 通过对象标识符查询 252
8.1.2 面向对象查询——HQL 253
8.1.3 按条件查询方式——QBC 254
8.1.4 按样例查询方式——QBE 255
8.1.5 传统的查询方式——Native SQL 256
8.1.6 选择合适的抓取策略 256
8.2 查询实现 258
8.2.1 Session的createQuery()方法 258
8.2.2 迭代获取结果 258
8.2.3 多对象查询 260
8.2.4 统计查询 260
8.2.5 绑定参数式查询 261
8.3 过滤器 262
8.3.1 Hibernate过滤器 262
8.3.2 集合过滤器 264
8.4 Hibernate分页支持 265
8.4.1 Hibernate分页实现 265
8.4.2 Hibernate分页原理 266
8.5 使用条件查询 269
8.5.1 创建Criteria实例 269
8.5.2 Criteria结构 273
8.5.3 Criterion 274
8.5.4 Projection 276
8.6 使用Native SQL查询 277
8.6.1 创建一个基于SQL的Query 277
8.6.2 命名SQL查询 278
8.6.3 指定字段/别名 279
8.6.4 使用存储过程来查询 280
8.6.5 Native SQL查询常用方法 281
8.7 查询优化 282
8.7.1 开启Hibernate SQL日志功能 282
8.7.2 单步跟踪应用执行情况 283
8.8 小结 283
第9章 HQL查询语言 285
9.1 HQL语言特点 285
9.1.1 HQL概要 286
9.1.2 面向对象 290
9.1.3 大小写敏感性 290
9.1.4 跨数据库性 292
9.1.5 相关Hibernate设置 293
9.1.6 关于本章例程 295
9.2 HQL查询构成 296
9.2.1 FROM——指定查询对象 296
9.2.2 理解多态查询 298
9.2.3 SELECT——指定查询结果 300
9.2.4 JOIN——使用连接 304
9.2.5 WHERE——指定查询条件 309
9.2.6 表达式 310
9.2.7 查询分组与查询排序 313
9.2.8 子查询 314
9.2.9 批量更新与删除 314
9.3 小结 315
第10章 事务与并发 317
10.1 事务概念 317
10.2 声明事务边界 318
10.2.1 在数据库中声明事务边界 318
10.2.2 在JDBC中声明事务边界 320
10.2.3 在JTA中声明事务边界 321
10.2.4 在Hibernate中声明事务边界 323
10.3 事务与Session的关系 327
10.4 事务隔离级别 329
10.5 Hibernate并发控制 330
10.5.1 悲观锁定 331
10.5.2 乐观锁定 332
10.5.3 session的lock方法与update方法的区别 340
10.6 最佳实践——怎样划分事务 341
10.7 小结 344
第11章 理解Hibernate缓存 346
11.1 缓存原理 346
11.2 Hibernate缓存 349
11.2.1 Hibernate一级缓存 350
11.2.2 Hibernate二级缓存 352
11.2.3 第三方缓存实现 354
11.2.4 缓存并发策略 358
11.2.5 最佳实践——二级缓存的应用 360
11.2.6 Hibernate查询缓存 363
11.2.7 最佳实践——查询缓存的应用 366
11.3 不要放任缓存增长 366
11.3.1 精确控制缓存失效策略 367
11.3.2 大数据量处理及时清除缓存 368
11.4 使用OSCache进行缓存 370
11.4.1 OSCache介绍 370
11.4.2 使用OSCache 370
11.4.3 OSCache集群缓存支持 374
11.5 小结 377
第12章 通过Spring访问Hibernate 378
12.1 简化Hibernate使用难度 378
12.1.1 会话管理的困难 379
12.1.2 业界流行做法 382
12.1.3 集中管理Session 386
12.1.4 最佳实践 391
12.2 Spring的Hibernate支持 392
12.2.1 Hibernate SessionFactory注入 393
12.2.2 借助模板访问Hibernate 397
12.2.3 回调Callback机制 402
12.2.4 HibernateDaoSupport支持 405
12.2.5 异常处理 406
12.3 Spring事务支持 408
12.3.1 事务声明 408
12.3.2 编程式事务管理 411
12.3.3 声明式事务管理 416
12.3.4 事务管理策略 423
12.3.5 最佳实践 426
12.4 小结 428
第13章 DAO透明持久化 429
13.1 DAO模式核心思想 429
13.1.1 DAO模式中的对象 430
13.1.2 数据访问对象 431
13.1.3 业务对象 432
13.1.4 传输对象 433
13.2 基于DAO模式的Hibernate设计 433
13.2.1 DAO模式设计 434
13.2.2 DAO接口设计 439
13.2.3 采用范型的DAO接口设计 440
13.3 DAO设计策略 444
13.3.1 事务的界定 445
13.3.2 DAO和透明持久化 446
13.3.3 数据访问操作的粒度 450
13.3.4 透明持久化和对象状态 451
13.3.5 DAO中域对象状态维护 452
13.4 DAO模式注意事项 453
13.5 不要让应用局限于Hibernate 453
13.5.1 使用Hibernate的局限性 455
13.6 小结 456
第14章 Web应用中的Hibernate 457
14.1 Web应用分层中的Hibernate 457
14.1.1 MVC模式 457
14.1.2 Web应用分层 460
14.2 Struts与Hibernate的最佳结合 462
14.2.1 Struts中的ActionForm 463
14.2.2 集成ActionForm与POJO 467
14.2.3 使用Spring建立桥梁 472
14.3 让分页不再是烦恼 476
14.3.1 页面分页几种方案 477
14.3.2 使用Hibernate的分页实现 477
14.3.3 适配不同持久方法的分页封装 479
14.4 异常处理 483
14.4.1 异常捕捉机制 483
14.4.2 在何处处理异常 484
14.5 使用拦截器与事件 486
14.5.1 Hibernate中的拦截器 486
14.5.2 Hibernate中的事件 488
14.6 Struts与Spring、Hibernate结合应用示例 489
14.7 小结 493
第15章 Hibernate性能 494
15.1 不要使Hibernate性能变成瓶颈 494
15.1.1 Hibernate的性能担忧 494
15.1.2 Hibernate的性能优化机制 495
15.1.3 提高Hibernate启动速度 503
15.2 不要掉入批量处理陷阱 505
15.2.1 Hibernate批量操作实现 505
15.2.2 批量插入改进方案 506
15.2.3 批量更新改进方案 507
15.2.4 考虑使用无状态Session批量操作 509
15.2.5 尽可能使用DML风格的批量操作 509
15.3 Web应用中的Hibernate优化 514
15.4 考虑替代方案 519
15.4.1 使用iBATIS实现 520
15.4.2 iBATIS持久策略 520
15.4.3 Spring中集成iBATIS 524
15.4.4 使用Spring中的JdbcTemplate替代 525
15.5 小结 527