目录 1
第1章 JDO的基本概念 1
1.1 JDO持久性服务 2
1.1.1 事务 3
1.1.2 创建持久对象 3
1.1.3 检索持久对象 3
1.1.4 更新持久对象 4
1.2 托管对象和非托管对象 5
1.1.5 删除持久对象 5
1.2.1 首要类对象和应用程序数据对象 7
1.2.2 次要类对象和嵌入式对象 7
1.2.3 非托管的数据对象 10
1.3 数据对象的十种管理状态 12
1.4 标识和惟一性要求 14
1.4.1 三种类型的JDO标识 16
1.4.2 惟一性要求 22
1.4.3 把瞬态对象链接到持久状态 24
1.5 小结 25
2.1 Extent接口 26
2.1.1 Extent和持久性管理器的IgnoreCache属性 26
第2章 查询 26
2.1.2 用于产生Extent对象的工厂方法 27
2.1.3 只读的CandidateClass属性 27
2.1.6 在Extent之外获得迭代器 28
2.1.7 关闭Extent迭代器 28
2.1.5 判断Extent是否包含子类 28
2.1.4 只读的PersistenceManager属性 28
2.2 JDO查询服务的设计 29
2.3 Query接口 29
2.3.1 设置查询的候选项 30
2.3.2 设置查询的Candidate类 30
2.3.3 设置查询的过滤器 31
2.3.4 声明查询的参数 31
2.3.5 声明查询的变量 31
2.3.8 运行查询 32
2.3.7 将查询结果排序 32
2.3.6 声明查询的输入 32
2.3.9 关闭查询结果 33
2.3.10 编译查询 33
2.3.11 IgnoreCache属性 33
2.3.12 只读的PersistenceManager属性 34
2.4 用于产生Query对象的工厂方法 34
2.5 JDO查询过滤器的句法 35
2.5.1 JDOQL的术语 35
2.5.2 JDOQL的操作符 37
2.5.3 JDOQL的查询方法 38
2.5.4 接口类型的一个普遍问题 39
2.6 查询变量 39
2.6.1 contains方法特殊的语法语义 41
2.6.2 受约束变量的语义 42
2.6.3 DeMorgan规则没有用于受约束的变量 42
2.7 排序查询结果 43
2.8 在查询中是使用缓存还是忽略缓存 44
2.9 可映射到JDOQL的SQL查询 46
2.9.2 用单对单关系在连接中选择 48
2.9.3 用单对多关系在连接中选择 48
2.9.1 在一个表中选择 48
2.9.4 用多对多关系在连接中选择 49
2.9.5 在自连接中选择 49
2.9.6 在外连接中选择 50
2.9.7 使用子查询选择 50
2.9.8 简单性是JDOQL的力量所在 50
2.11 JDO和JDOQL是如何有助于开发过程的 51
2.10 在JDOQL不能满足需要时使用SQL 51
2.12 小结 52
第3章 持久性管理器 53
3.1 方法参数中的null值处理 54
3.2 获得和关闭持久性管理器 54
3.2.1 关闭持久性管理器 54
3.3.1 xxxAll操作的行为 55
3.3 数据对象的JDO管理的控制 55
3.2.3 只读的PersistenceManagerFactory属性 55
3.2.2 只读的Closed属性 55
3.3.2 设置和删除持久对象 56
3.3.3 向事务添加对象和从事务中移除对象 58
3.3.4 从JDO的管理中移除持久对象 61
3.3.5 能替代调用makeTransient方法的方法 62
3.4 控制缓存 63
3.4.1 检索持久状态 63
3.4.2 驱逐持久状态 65
3.4.3 刷新持久状态 66
3.5 获得和构造标识对象 67
3.6 根据标识提取应用程序数据对象 68
3.7 持久性管理器中的工厂方法 69
3.8 获得持久性管理器的事务 69
3.9 持久性管理器的属性 69
3.9.1 IgnoreCache属性 69
3.10 小结 70
3.9.3 UserObject属性 70
3.9.2 Multithreaded属性 70
第4章 事务和缓存 71
4.1 事务 71
4.1.1 JDO中的乐观事务和数据存储事务 72
4.1.2 隔离等级和事务间的交互 73
4.1.3 JDO实现定义其事务的隔离等级 74
4.2 JDO的Transaction接口 74
4.2.1 控制事务边界 75
4.2.2 只读的PersistenceManager属性 76
4.2.3 5个事务属性 76
4.2.4 与事务的完成同步 82
4.3 事务属性是如何控制状态转换的 84
4.3.1 事务之外的JDO状态转换 84
4.3.2 事务内的JDO状态转换 85
4.3.3 数据存储事务独特的JDO状态转换 86
4.3.4 乐观事务独特的JDO状态转换 87
4.3.6 当RetainValues为true时JDO的状态转换 88
4.3.5 当RetainValues为false时JDO的状态转换 88
4.3.7 当RestoreValues为false时JDO的状态转换 89
4.3.8 当强RestoreValues为true时JDO的状态转换 90
4.3.9 当弱RestoreValues为true时的JDO状态转换 90
4.4 可选的瞬态事务特征 91
4.5 JCA、JTA和JDO事务 92
4.6 持久对象及其状态的JDO缓存 93
4.6.3 控制持久性管理器的缓存 94
4.6.2 持久性管理器的缓存何时可以提高性能 94
4.6.1 从缓存中移除持久对象 94
4.6.4 JDO实现的二级缓存 95
4.7 小结 96
第5章 增强类和托管字段 97
5.1 应当增强哪些应用程序类 97
5.2 托管字段和非托管字段 98
5.2.1 哪些类型的字段可以是非托管字段 98
5.2.2 哪些类型的字段可以是事务字段 98
5.2.3 哪些类型的字段可以是持久字段 99
5.3 增强 100
5.3.1 预期的增强效果 101
5.3.2 增强的副作用和局限性 102
5.4 JDO元数据 113
5.4.1 JDO元数据文件的名字和位置 113
5.4.2 JDO元数据的结构 114
5.5 小结 124
6.1 PersistenceManagerFactory接口 125
第6章 产生持久性管理器的工厂 125
6.2 获得持久性管理器 126
6.2.1 从持久性管理器工厂获得持久性管理器 126
6.2.2 从连接工厂获得持久性管理器 126
6.3 获得持久性管理器工厂 127
6.3.1 JDOHelper中的getPersistenceManagerFactory方法 127
6.3.2 从JNDI获得持久性管理器工厂 130
6.3.3 构造持久性管理器工厂 131
6.4 关闭持久性管理器工厂 131
6.6.1 确定实现对可选特征的支持 132
6.6 分析JDO实现 132
6.5 获得连接工厂 132
6.6.2 从实现获得特定供应商的信息 134
6.7 配置持久性管理器工厂 134
6.8 配置到数据存储的连接 134
6.9 JDO对容器管理事务的支持 135
6.10 JDO对bean管理事务的支持 136
6.11 在CMT会话bean中使用JDO 136
6.13 在带BMP的实体bean中使用JDO 142
6.12 从业务方法返回已串行化的数据对象 142
6.13.1 EJB的实体环境回调方法 146
6.13.2 QuoteServer bean的setup方法和cleanup方法 146
6.13.3 ejbStore回调方法 147
6.13.4 调用ejbStore时,谁负责把修改刷新到数据存储 147
6.13.5 实体EJB的业务方法 148
6.13.6 ejbLoad回调方法 148
6.13.11 ejbFindByPrimaryKey方法 149
6.13.10 ejbRemove方法 149
6.13.9 ejbCreate方法 149
6.13.8 ejbActivate回调方法 149
6.13.7 ejbPassivate回调方法 149
6.13.12 EJB查找器方法 150
6.13.13 在业务方法的响应中串行化数据对象 150
6.13.14 转换到一个连接工厂 150
6.14 在BMT会话bean中使用JDO 150
6.14.1 无状态BMT会话bean 151
6.14.2 有状态BMT会话bean必须作出的改变 153
6.15 在消息驱动bean中使用JDO 154
6.16 小结 155
第7章 JDOHelper、回调和异常 156
7.1 JDOHelper实用类 156
7.1.1 JDOHelper中的各种实用方法 156
7.1.2 确定数据对象的管理状态 159
7.2 InstanceCallbacks接口 161
7.2.1 jdoPostLoad回调 161
7.2.3 jdoPreClear回调 162
7.2.2 jdoPreStore回调 162
7.2.4 jdoPreDelete回调 163
7.2.5 使用InstanceCallbacks方法的途径 163
7.2.6 实现InstanceCallbacks的隐含意义 171
7.2.7 在回调方法内部抛出不需检查异常 171
7.3 JDO异常 171
7.3.1 JDOException构造函数 172
7.3.2 得到嵌套异常 172
7.3.5 一个处理JDO异常的普遍策略 173
7.3.4 覆盖的方法 173
7.3.3 得到失败对象 173
7.3.6 各种JDO异常 175
7.3.7 JDO实现可能抛出的其他运行时异常 179
7.3.8 几个处理JDO异常的代码示例 180
7.4 小结 183
第8章 使用JDO学习更多知识 184
8.1 Ant构建脚本 184
8.2.4 第四步:如有必要,下载J2EE Jar 186
8.2.3 第三步:如有必要,下载Ant 186
8.2 开始 186
8.2.2 第二步:如有必要,下载Java SDK 186
8.2.1 第一步:下载开放的源JDO学习工具 186
8.2.5 第五步:下载JDO实现 187
8.2.6 第六步:配置构建属性 187
8.2.7 第七步:测试构建环境 188
8.3 Hello,JDO 189
8.4 询问PersistenceManagerFactory 190
8.5 MegaCups公司的消费Java 192
8.6 控制台用户接口 194
8.7 查询小镇图书馆 195
8.7.1 构建Library程序 196
8.7.2 使用Library命令 196
8.7.3 运行Library程序中的查询 197
8.8 监测持久苹果的状态 199
8.8.2 以StateTracker命令开始 200
8.8.1 构建StateTracker程序 200
8.8.3 简单介绍其他StateTracker命令 204
8.9 使用商业实现 205
8.9.1 使用Kodo实现 205
8.9.2 使用Lido实现 205
8.9.3 使用IntelliBO实现 206
8.10 小结 206
第9章 在Swing应用程序中使用JDO 207
9.1 构建租赁Swing应用程序 207
9.2 对原型预订系统的要求 208
9.2.1 用例1:管理员清除数据存储 208
9.2.2 用例2:管理员初始化数据存储 208
9.2.3 用例3:匿名用户标识他自己 208
9.2.7 用例7:有标识用户查看他的预订 209
9.2.9 用例9:有标识用户改变他的预订 209
9.2.8 用例8:有标识用户取消某些预订 209
9.2.6 用例6:有标识用户进行一次预订 209
9.2.5 用例5:用户查看可用的租赁 209
9.2.4 用例4:有标识用户丢弃他的标识 209
9.2.10 用例10:系统探测相冲突的预订 210
9.2.11 用例11:用户查看租赁单元的附加信息 210
9.3 测试租赁Swing客户 210
9.4 在租赁Swing客户中遇到相冲突的改变 211
9.5 设计租赁Swing应用程序 213
9.5.1 租赁Swing应用程序的应用程序数据类 213
9.5.2 租赁Swing应用程序中的应用程序数据服务 215
9.5.3 租赁Swing应用程序中的应用程序数据模型 217
9.5.4 租赁Swing应用程序的总体体系结构 218
9.6 小结 219
第10章 在Web应用程序中使用JDO 220
10.1 为Tomcat配置构建环境 220
10.1.1 第八步:安装Tomcat Servlet容器 220
10.1.2 第九步:安装JSP标准标签库 220
10.1.3 第十步:配置构建环境 221
10.2 构建租赁Web应用程序 221
10.3 使用租赁Web应用程序 223
10.3.1 启动两个浏览器客户 224
10.3.2 在租赁Web客户中遇到相冲突的预订 225
10.4 Web应用程序的一般性设计问题 226
10.5 租赁Web应用程序中的MVC模式 227
10.6 设计JDO在Web应用程序中的使用 228
10.6.1 会话串行化在servlet容器中的任务 229
10.6.2 设计目标 229
10.6.3 避免付出垃圾回收的代价 231
10.7 One-PM-per-Request设计 231
10.8 One-PM-per-Session设计 243
10.9 One-PM-per-Update设计 244
10.10 小结 245
第11章 在企业JavaBean中使用JDO 246
11.1 为JBoss配置构建环境 247
11.1.1 第十一步:安装JBoss 247
11.1.2 第十二步:配置JBoss和Tomcat,以使它们能一起使用 247
11.1.4 第十四步:替换JDO参考实现 248
11.1.3 第十三步:配置构建属性 248
11.1.5 第十五步:配置JDO连接工厂 249
11.1.6 第十六步:配置JNDI 250
11.2 构建租赁企业应用程序 250
11.2.1 补充几个小技巧 251
11.2.2 使用租赁企业应用程序 252
11.3 租赁企业应用程序的设计 252
11.3.1 预订服务EJB的设计 252
11.3.2 预订服务中被封装的改变 253
11.3.4 对应用程序数据类所作的改变 254
11.3.3 对预订服务所作的公有改变 254
11.3.5 对ReservationServlet控制器所作的改变 255
11.3.6 还有其他改变吗 256
11.3.7 提高复杂性 256
11.4 把JDO用于其他类型的EJB 256
11.4.1 构建引证服务器EJB 256
11.4.2 使用引证服务器 257
11.5 小结 258
术语表 259