该用户从未签到
|
基于理论,注重实践。避免了大量的理论罗列,先使读者有了一定的感性认识,再继续深入,上升到理性,符合学习知识的客观过程。
6 v0 \: N0 D1 c: R$ B2 Y 内容翔实,实例丰富。不仅对JPA的理论进行了详细的讲解,而且辅以大量实例,使读者可以边学技术,边进行实践。
) ]! ^' D9 X6 Y 注重实际,应用为王。精心挑选的大量示例程序都是作者在实际开发中的经验总结,涵盖了实际开发中可能遇到的各种问题。
. Q& }7 e( _% R9 \* t 取材广泛,内容充实。覆盖JPA技术的各个方面,从最基本的简单概念到JPA高级应用的相关技术,再到JPA结合各种框架的使用,是对JPA内容体系的整体总结。 c/ U+ |4 ~! T! n
注重基础,高于基础。不仅对基础知识进行详解,还大量讲述了其基本实现原理。使读者不仅知道如何应用,而且能理解最本质的内容,从而便于以后更深入地学习。3 `' d8 t- [' s
本书全面介绍了JPA(java Persistence API)的相关知识。全书共分4篇,第1篇介绍了JPA产生的背景及JPA的运行环境、流行的开发工具IDE等;第2篇介绍了 JPA基本知识,包括映射实体、映射实体关系、实体管理器及JPQL的相关知识;第3篇进一步介绍了关于JPA的高级应用,包括持久化上下文、XML映射文件、打包和部署、JPA实现框架和与spring集成等;第4篇介绍了三个完整案例,分别是学生成绩管理系统(Servlet+JPA)、宠物商店(Swing+JPA)、博客系统(struts2+Spring2+JPA)。
/ i4 ?7 a2 j) D: E4 P 本书结构清晰,注重实战,深入浅出,非常适合JPA开发人员学习使用,同时也可用做高校相关专业师生和社会培训班的教材。
& s; z5 |6 |( H0 K0 J5 x! P8 q5 m q
3 z' x$ A f9 F& f: g第一篇 初识JPA+ O( K5 \# j: Z& y4 c- h! g
第1章 JPA概述 7 F3 Z- ~4 a: T% k
1.1 什么是数据持久化 ; W* K8 Z8 t, R6 H
1.2 Java持久化技术
" R) x( v! {: q4 S/ W 1.2.1 序列化(Serialization) 9 I+ R- o8 V; L* P
1.2.2 JDBC
6 U% v: ]2 U& K 1.2.3 关系对象映射(ORM)
8 p6 Z/ I& ]# |7 s2 S 1.2.4 对象数据库(ODB) 4 C( F% t- c: B" z( f" r7 t
1.2.5 Java数据对象(JDO)
7 F0 r% E2 ?! r1 P/ z2 v, n 1.2.6 EJB 2.X / @) j: P2 O2 a5 X1 I+ ~
1.3 JPA(Java Persistence API)概述 / B6 S# U5 c# x3 |0 j* P G
1.3.1 什么是JPA
w/ O5 X! w: I' c2 U/ _7 U" x; u 1.3.2 JPA的历史
9 ^0 R4 z# C$ {" N6 j7 y 1.3.3 下载JPA规范
; w8 l6 j3 F; _, g' w7 S 1.3.4 JPA的优势
4 _! ~8 J: p: m: W2 ^ 1.3.5 EJB 3与JPA的关系 9 e. h' X$ M, g/ e, \
1.3.6 常见的实现JPA的框架 1 \) E5 I5 Z$ y `0 F
1.4 对象关系映射(ORM) 5 q/ J9 @: x$ d- W- b4 j$ c
1.4.1 什么是对象关系映射 * `% k% T( r. |: L5 ~
1.4.2 对象关系映射模式
$ Z) C/ t7 _# I2 p# p 1.5 本章小结 - c7 g/ e# v& x* j0 R
第2章 搭建JPA开发和运行环境 - N8 L* Z! l: _( \) ^5 Q
2.1 JBoss概述 , v: P* o' ~1 c" w `. |
2.1.1 JBoss Application Server
' P1 B5 e/ F! ~6 N+ U8 c. C1 p 2.1.2 JBoss IDE for Eclipse * B) v1 `5 x6 l+ K, N' ^
2.2 JBoss应用服务器的搭建 $ Q) t! L+ j6 E5 n
2.2.1 下载和安装JBoss服务器
' n- X0 W. F. H- B6 Z! Z& M) ^ 2.2.2 启动JBoss服务器
# \. a: T- a, n4 d7 ^7 L+ B( [$ L 2.2.3 停止JBoss服务器 3 N( h2 F/ F9 v- \
2.2.4 JBoss的文件目录结构 # B! H! r; r$ N8 p1 f3 k
2.3 JBoss IDE开发环境的搭建! F# y) B; m8 w: T: J/ Z, x3 q+ l
2.3.1 下载JBoss IDE for Eclipse
# ?# N( N; ~6 t 2.3.2 Eclipse中配置JBoss 6 a7 N. ~ z& f# C! b, Z) Q" n
2.3.3 Eclipse中启动和停止JBoss ' X7 N1 z. _6 [
2.4 MySQL数据库的下载和安装
6 W* b0 ]) Y" a. u7 D& u 2.4.1 MySQL数据库概述 ) m* Z$ K& u3 d+ B( z
2.4.2 下载MySQL
2 I3 e6 ^0 P- F4 u N 2.4.3 安装MySQL 2 S4 i1 U; {+ Y/ { i% e6 p% L
2.4.4 运行MySQL ) O/ ^( b" C$ t/ B; b
2.4.5 下载MySQL客户端 1 b H! T( P r& \4 i
2.5 本章小结 % {8 y' T* X* P/ b2 R3 p. R' q0 z
第3章 JPA之初体验
3 s0 }: d+ x4 b6 ^: t 3.1 第一个Entity实体类
' g- p* F0 u# | 3.1.1 第一个POJO类
\: _: N" X) |+ X 3.1.2 数据库中对应的表 0 L/ ?2 m& w6 Z k0 D6 ~$ l# f
3.1.3 使用注释(Annotations)配置ORM映射 + d* ^# W& o z+ W. ?$ N5 B$ T
3.1.4 配置persistence.xml # P0 \, k% t6 Z1 c9 `7 r
3.2 第一个SessionBean 6 i- Q* R8 E) n( X, }
3.2.1 定义Remote接口7 ^) i( X C$ k
3.2.2 SessionBean类 6 I4 }; q% S* s. h
3.3 使用EntityManager操作实体
8 J( S% H; @7 m& w D$ h 3.3.1 依赖注入EntityManager . l# j4 N8 n) w. J4 @ \$ O- a
3.3.2 添加Entity 5 Q. o; A) t5 c1 w" O' z7 w
3.3.3 根据主键查找Entity 9 V" t) X# v. L4 F$ Z1 [0 y- v
3.3.4 更新Entity 6 H9 O+ o! d! x, v# j% d: O
3.3.5 删除Entity
c6 n. d' z+ _ 3.3.6 执行查询
/ h y( a. C# @8 \: u+ k% U 3.4 部署EJB ' _6 @, x y. i0 k/ }
3.4.1 打EJB-JAR包
8 p# o6 t4 N" q8 _6 ] 3.4.2 部署EJB
# S6 J, k) j8 F, x5 v5 j 3.4.3 配置DataSource数据源
2 Z$ Y2 o5 P; c1 m 3.4.4 启动JBoss服务器
2 Z7 Y# _4 ~0 j5 ?* r. N 3.4.5 查看JBoss控制台JMX-Console ; k( x* ^3 @9 |4 @! D
3.5 调用EJB的Client
; E$ O* I7 W' E8 ]7 f" z4 D" E 3.5.1 TestClient类# b( Q6 G7 _0 m, y) O& b6 T
3.5.2 运行Client
! e1 O6 \% K4 L! t4 {& v) [ 3.6 本章小结 - ], A" ~% {+ n
第4章 JPA开发工具 ! Y% F$ V1 y8 v, K+ [$ C
4.1 Eclipse Dali JPA 概述 5 p& V( x1 p: s2 m3 B5 r- j. \
4.1.1 什么是Dali JPA
0 J" H( B) z+ f9 e 4.1.2 下载Dali JPA
$ M( \% J; W6 U a: ]/ N& i* m 4.1.3 Dali JPA界面预览
8 |3 C$ \; t' s% F+ G8 m 4.2 连接数据库
2 ^4 X" A/ P0 v" `* }. ?0 J+ A( B) Z 4.3 开始JPA开发 6 `" a( E" d! g) t& z8 | L! k! _4 X
4.3.1 创建JPA项目
- U# K4 n, v$ Y* F 4.3.2 创建持久化类 1 [/ p4 C+ O [7 \
4.4 本章小结 " p( t$ \+ S5 t& C; M
第二篇 JPA进阶! i) C" l: e7 S, t
第5章 映射持久化对象(Entity) 7 F- X1 p+ z& r) P! P
5.1 实体映射基础
2 M9 w- w/ Q5 @5 Z7 L 5.1.1 简单的POJO类 ) l3 K) p3 P9 ?6 h( n7 q6 I, [) Q" U
5.1.2 映射实体(@Entity) # H8 `# C: F+ l/ p! G* T& g* h: f
5.1.3 无参的构造方法
' h, ?0 l. F3 k4 {# F! H7 j- m 5.1.4 实现Serializable接口
/ h" r& L! s% x# x. I 5.1.5 可继承性 ' J* C. ^: G% ~; U/ s; i9 E
5.1.6 标注主键(@Id)
4 y$ L# Q3 F3 ~# {# E 5.1.7 默认实体映射
6 o$ X" l6 O2 @# I 5.2 映射表和字段
% }* L% H4 @! X$ a 5.2.1 映射表(@Table) 4 @; X" z, W6 M. x* ^3 R& L
5.2.2 映射方法和属性(@Column) |! M! D9 x+ }' x( b* s$ {
5.2.3 可持久化的基本数据类型 + `( D. \% X S
5.2.4 映射优化一:基本数据类型VS封装类 Z; w+ p5 ?% {4 }
5.2.5 映射优化二:@Basic设置加载方式
# O2 s" F1 z \ 5.3 主键映射
6 x! ]( U8 v) y 5.3.1 主键标识(@Id) 4 |( A( u; |2 t( r- [% H
5.3.2 自增主键 : \0 N. O* F9 h' u- L9 l7 D2 X3 v: F
5.3.3 表生成器(@ TableGenerator) % b) o' Y3 ]7 j" W2 b) S1 I
5.3.4 Sequence生成器(@ Sequence) ; e5 |. p+ p ?$ D9 u+ I( f
5.3.5 Identity生成器 , H& [- t* w% ^) }" t. {
5.3.6 复合主键(@IdClass) * {2 ?, B" ^9 ~4 ?: K; Q
5.3.7 嵌入式主键(@EmbeddedId) ! M8 H& F$ r# {
5.3.8 几种主键生成策略的比较
! \/ J$ \7 a$ F8 H* B 5.4 映射特殊类型 + x! U6 h$ T1 A# U2 _3 c
5.4.1 映射Blob和Clob类型(@Lob)
R! m# @3 T9 p1 h, f" `2 B" \" v 5.4.2 映射时间(Temporal)类型(@Temporal) ! I3 I e7 L/ i- o" e, ` Q$ Y
5.4.3 映射枚举(Enumerated)型
! p1 g& F- |5 ^" Z4 ^$ F9 _ 5.5 映射非持久化类型(@Transient) : |1 F% D6 j9 l* F/ j* X8 h1 J1 o: R! g
5.6 本章小结
~! G# ~% E6 q% J7 z' }& I" H9 S) R 第6章 实体关系映射
% x0 ^# L" v) s. A2 ]* @1 B& f4 O& z 6.1 实体关系概述 0 `. s4 L) I% C0 N/ W
6.1.1 实体关系的方向性
0 C6 [; c' ?- Y( v# ^7 } 6.1.2 实体关系的数量性
" P9 C5 ?$ W, Q! H) Z% R3 F- ? 6.2 一对一(@OneToOne)
7 P" V q. H5 Q0 @# C# s/ y0 {9 h 6.2.1 单向关联(Unidirectional)
5 h; ~! | U: I/ U4 E" U 6.2.2 一对一(@ OneToOne)
; K5 M- W9 ^6 E 6.2.3 关联指定列(@JoinColumn)
2 {/ ]3 S3 T( U# s. L& Q 6.2.4 双向关联(Bidirectional)
' Z7 P. W5 p8 E 6.2.5 主键关联(@PrimaryKeyJoinColumn) ! ?4 I8 o; o8 z, h
6.2.6 默认关联 $ Y: |' r6 z9 f* x. ?
6.2.7 一对一映射的一般步骤 . H3 D/ H$ I7 o) w
6.3 一对多(@OneToMany) / g- h) P! j4 C" o. H
6.3.1 一对多模型(单向) 3 x6 n* L0 s; R: x
6.3.2 映射策略 89: y- e/ k* x4 M. F4 Y
6.3.3 映射策略——外键关联 3 M# a* U' Q' j" b4 j0 N+ o0 ~
6.3.4 一对多(@OneToMany) q2 v4 a9 {* V ^8 _- f
6.3.5 映射策略——表关联
( j- d4 h* y/ ^% k 6.3.6 表关联(@ JoinTable)
0 t7 [) G' R! k- ^8 l0 h 6.3.7 默认关联 / X# {* |/ s& a* L& J/ C. y7 x' O
6.4 多对一(@ManyToOne)
- J$ Y3 P: O+ o/ E 6.4.1 多对一 模型(单向) + m; Z# K& @' ^) i9 r4 F0 u+ j+ |
6.4.2 映射策略——外键关联 ) \2 N0 J# e! m. y4 j8 {' q# u' t
6.4.3 多对一(@ManyToOne)
: y: N3 W! V: F 6.4.4 默认关联 7 U9 C( P* ]" H/ N! _
6.5 高级一对多和多对一映射 7 t/ X7 }) |5 X5 D4 T
6.5.1 双向关联模型 7 }3 B9 d& r9 d; u( h0 }) Z
6.5.2 双向关联 $ `$ b3 W& H1 b# u, I8 i/ P9 q
6.5.3 一对多(多对一)映射的一般步骤 . W& b% X& e+ G) V4 d! z C
6.6 多对多(@ManyToMany) 1 u6 B) b$ K3 Y/ R9 C4 M
6.6.1 多对多模型(单向) 0 k& n$ Y/ m3 U! F1 D: [2 }
6.6.2 映射策略——表关联 + J, H, n9 H- Y6 W5 ^
6.6.3 @ManyToMany
+ f# ]4 ?( }& i/ O 6.6.4 双向关联模型 # ^0 n% P; y0 d
6.6.5 默认关联 7 q6 X' X- L: z. n- e4 U5 Z
6.6.6 多对多映射的一般步骤 7 ^+ c6 ]% \) H$ |$ V
6.7 集合类的选择 ) ]2 S. h- k' I! Z# B
6.7.1 集合类的区别 . {# @- x7 V0 K& N' m, o% I$ f
6.7.2 带排序的集合
/ S) @. g0 D, _6 K 6.7.3 带Key值的集合
/ h# I* H- ^1 n- C! X* S 6.8 关系映射示例:客户关系管理系统
, [5 l" \8 C0 U( \. m 6.8.1 实体关系类图 3 L! q5 m1 u1 B% L2 M7 w2 d( E
6.8.2 数据库表结构 ' I! ?0 f+ I. f. ^ G. h6 [: n) n
6.8.3 客户实体
6 I, b& I5 i5 r6 s/ i 6.8.4 地址实体 + s/ B8 o) U# D/ o- c+ a! V3 |
6.8.5 联系人实体 ( j. o. e" y( v4 @
6.8.6 头像实体
) u& X9 I4 ^9 s* t4 s 6.8.7 电话实体 & u' e ]' r& n) P
6.8.8 订单实体 " r5 m; b8 L0 x1 X1 ~; i
6.8.9 订单明细实体 M& P5 x0 K' W- I
6.8.10 产品实体
) n3 L: O6 q2 s9 F! l( s 6.9 本章小结
3 ^+ h P1 E4 V" n- ? 第7章 实体映射的高级应用
! O; y U+ {6 l' Y8 F8 A4 _ 7.1 多表映射
9 u- v) M" t% y 7.1.1 两个表映射为一个实体
, p7 C9 M' g/ L' y6 a9 H. N 7.1.2 从表注释(@ SecondaryTable)
# u$ T# k# K1 X/ k4 F 7.1.3 多个表映射为一个实体
: {7 E6 q' ?4 k+ f 7.1.4 多个从表注释(@ SecondaryTables) 5 s; d9 ?- \. b
7.2 嵌入映射 : t* A$ t4 U ~" ]" G- w$ M
7.2.1 嵌入映射表结构
* ^- z0 N, r3 {6 n0 s& U$ H 7.2.2 嵌入类
# A$ S2 M P1 ~3 m) u i 7.2.3 嵌入到实体
4 k5 z7 D# b( ~; U: Z$ Q6 h9 I 7.2.4 映射属性(@AttributeOverride) % v, H) i% o9 `3 c9 S# J z
7.3 实体的继承策略
3 {9 r# p' f+ Y/ X 7.3.1 类结构关系图 }' c0 b" M9 j! F
7.3.2 三种继承策略 ! R# o, c _. W
7.3.3 继承关系的实体保存在一个表(SINGLE_TABLE) + V/ q$ J5 p2 u9 I
7.3.4 每个实体子类保存在一个表(JOINED) 0 P+ j3 y! s1 A' R
7.3.5 每个实体类保存在一个表(TABLE_PER_CLASS) / S! t& Y9 [) U! f5 X# I. |
7.3.6 三种继承策略对比
5 l+ s9 w1 Q( m. B- e 7.4 深入实体继承 + C5 U: ]; i l0 S8 l2 K
7.4.1 继承自抽象(abstract)实体类 + y( y0 Y [$ Y }2 z
7.4.2 继承自非映射实体类(Mapped Superclasses)
( R" S( @8 U% z9 g1 f8 m3 E 7.4.3 继承自非实体类 * J O! V/ D3 m9 e; _5 E
7.4.4 继承的设计重构
# S* M4 X. L1 M& d 7.4.5 带继承关系的实体查询(多态)
# ]9 E+ J6 I7 q/ }, n* Q: I 7.5 本章小结 - B6 Z6 ~, d J5 S
第8章 实体管理器(EntityManager) / O- N- g/ R7 o+ r
8.1 实体管理器概述 & d1 ~7 K+ z! B
8.1.1 什么是实体管理器 " A+ F0 ^- I; M6 `) I8 C: r
8.1.2 Entity Manager API 1 Y# Q9 [( G& s& L0 X" P9 n
8.1.3 EntityManager方法详解 $ o; L5 M1 J( U4 [7 s
8.2 操作实体(CRUD) / M% R7 q" D \) }$ h- `$ F; l
8.2.1 创建实体(持久化)
$ q) j5 u7 p( C# a9 H 8.2.2 持久化带关系的实体 ; [7 y7 H( ?8 a- N
8.2.3 根据主键查找实体
! t- j. {9 Z7 \$ f8 Q. R 8.2.4 实体属性及实体的加载方式 + c; T7 [& Q/ b% Q+ q ]; v
8.2.5 更新实体 5 k6 R' Z* V3 E2 q$ U
8.2.6 更新实体关系
" n, J2 J3 H+ S7 u% i 8.2.7 删除实体 ' r5 N9 o [7 X) \) z
8.2.8 删除关联的实体 ; ` |7 [1 n( a D
8.3 实体的生命周期
" ^& V3 _# X& s" i 8.3.1 实体的几种状态 % S5 d" T; X: t, E$ ~6 R
8.3.2 瞬时状态(Transient)
) Q0 z. V4 b3 o& ]# C; X5 u0 u 8.3.3 持久化状态(Persisted)
7 L" W7 e; T% ^, n 8.3.4 托管状态(Attatched或Managed) 1 R Y3 D- m( Q2 c2 E; \: v
8.3.5 游离状态(Detached) $ n7 n/ J( `( O; I( l% a
8.3.6 销毁状态(Removed)
9 S4 C3 E g4 h, f8 o 8.3.7 分析实体状态实例
, z$ h/ g0 p+ \9 @# Z% v 8.4 实体的高级操作 # c5 Z w M. S% a# G" ?2 y
8.4.1 实体的联级操作 - Y) @- f2 F% @. N4 P
8.4.2 获得实体的另一种方式 7 ` X/ [% u0 V; ?
8.4.3 同步数据库(flush与flushType)
" R8 _( y. T( q3 } 8.4.4 refresh()和clear()方法
, ^3 e( r. M# r2 ]% j3 t9 d 8.5 实体监听器(Listener) ) `+ Z- h1 O% ^; M1 c
8.5.1 回调事件(Callback Events)
3 a9 B. T- \1 |6 J3 p 8.5.2 监听器定义在实体中 4 U0 _" c, x' R
8.5.3 监听器定义在实体外
5 H4 D p4 U, _6 X. h1 W+ K 8.5.4 默认实体监听器 7 u+ b2 ^' p/ m g1 U
8.5.5 继承中的实体监听器 / M1 B R3 q6 p' p# p/ J# M9 E
8.5.6 监听器的调用顺序 & e; Q9 l6 ]. i% u/ [0 ]2 m+ S
8.5.7几种监听实体方式的比较
% h# z7 Y- G |& n1 g 8.6 本章小结
7 w4 ]$ a/ @# c; d: u 第9章 查询(Query)
: I3 S4 o, o1 W 9.1 Query 概述
% B* c$ B/ C" Q1 V 9.1.1 一个简单的查询示例 7 m' x8 u2 T' Q
9.1.2 Query API " }4 S! ~# b6 R% o7 Y
9.1.3 Query 方法详解 4 F' y+ q! {8 K) W5 U) u# t
9.1.4 Query的简化写法 3 D5 W% ^5 p% a: t5 c- q
9.2 JPQL入门
# l7 {; _! i, f1 q 9.2.1 查询实体
; K1 _4 t( l5 J: t! p* V 9.2.2 查询实体属性 0 z8 d8 D) m' w7 H6 B7 k( H
9.2.3 查询关联实体 / o: M8 T- t6 b) k' i3 L
9.3 准备查询 % d& C- w4 g+ m* {
9.3.1 查询参数方法一——命名设置参数 * |' A1 Y. H0 j2 |, E* ]
9.3.2 查询参数方法二——位置设置参数
$ x' q! h: ^4 S" G5 a3 [ 9.3.3 不带参数的查询 7 r2 h# N" ~0 ?& M! T. U
9.3.4 查询策略的选择 ; m% k8 ~6 e! E1 G
9.3.5 分页查询
5 c. F( V$ g$ G$ T9 P4 T/ R 9.3.6 设置提示(Hints)
) c8 T7 M4 ` J5 n# b) I+ H/ L 9.3.7 设置提交模式(FlushMode) ) V/ b m/ U# I( h2 q2 v- S" j
9.4 命名查询(Named Query) & [- U( E( A+ B3 ~5 Z- o
9.4.1 命名查询示例 ) w# A& j4 @( L# `7 I6 Z
9.4.2 定义查询命名
8 L' f" O# o7 S 9.4.3 @NamedQuery注释 1 P4 o- ~; r9 l
9.5 查询结果的处理 7 I2 E5 n6 b& j( e
9.5.1 执行查询 $ F, W) V! M" f* Y% S8 i' A
9.5.2 查询结果的类型 8 r5 g. l; _. O5 H7 A( }0 i) ]
9.5.3 查询结果为实体
6 y! L6 S, q3 l4 Y 9.5.4 查询结果为基本数据类型
# ~( |4 A; a& o% R) H6 q# V' M 9.5.5 查询结果为数组
1 ^$ `) [) O3 C- \; B 9.5.6 查询结果为自定义对象
/ Q7 d( \, T. j" d; Y 9.6 本地查询(Native Query)
: G. U$ ?8 R7 X* Z) o" Y, n 9.6.1 本地查询概述 2 w& {2 l3 b# K2 P1 i9 x2 C% w- F
9.6.2 执行本地查询 % G0 O0 g: G% l$ m
9.6.3 查询结果与实体映射 & w' [% {$ {% z9 S
9.6.4 自定义查询映射 1 z( A! N! F% K8 Q% a: U
9.6.5 @SqlResultSetMapping 9 Z, |0 }2 _0 b5 k& w
9.6.6 @NamedNativeQuery本地命名查询 8 ]% ^0 _& ]$ Y2 I
9.7 查询技巧 1 ] T( O' P" `+ E0 t6 J- D
9.7.1 日期类型的查询
5 R& S$ F0 Q( Z; R2 R, \ 9.7.2 动态查询 ! f2 Y5 r0 B# L% k2 F+ F% p
9.8 本章小结 & Z* j9 s( B. Q" D( L4 N
第10章 查询语言(JPQL) N. I# _/ @: R' ^
10.1 JPQL基础 9 |8 i6 I0 K4 H, F
10.1.1 JPQL基本语法
+ W: {' U+ a1 |% y1 D 10.1.2 SELECT子句
2 p+ l" b( B# R' D 10.1.3 继承实体的查询 ' Z7 c8 o% i8 T9 e2 S4 ^1 \- R
10.2 FROM语句
( F3 w# x( r i0 g! u0 s' ~ 10.2.1 FROM基本语法
# i S% R" t& n' x2 A4 g! o9 ? 10.2.2 基于集合实体的查询(关联查询)
! ]( T! M2 d# M+ h+ ~0 f# S0 e 10.2.3 关联查询
) p0 _# `3 t4 ? v 10.2.4 内连接(INNER JOIN)
! [: w' @5 s6 Y3 w2 t- ~ 10.2.5 左连接(LEFT JOIN) # b9 ~ _5 w" w- M
10.2.6 抓取连接(FETCH JOIN) 6 y! q1 J% Z8 ^+ I
10.2.7 唯一性查询(DISTINCT)
7 b- a" t1 F; Z5 G, [3 r 10.3 WHERE语句 0 }1 {, W; f$ I. Q4 Q
10.3.1 WHERE基本语法
8 i. y* [9 V* v0 ^ 10.3.2 直接量(Literals)
+ ]0 [2 [) Z/ y% g8 ?* d$ T+ }3 t: O 10.3.3 查询条件操作符优先级 6 R! X' P* H( X+ j
10.3.4 算术操作符(Arithmetic Operators)
! t7 l' I3 L$ o- d' ] 10.3.5 逻辑操作符(Logic Operators)
& W4 o- }# S1 X6 z! A! h; P+ a 10.3.6 比较操作符(Comparison Operators) % p5 I/ L5 j6 G
10.3.7 BETWEEN操作符 5 [' D1 d5 K F3 A1 }
10.3.8 IN操作符 ' Q2 a& S& P5 \( c7 G
10.3.9 LIKE操作符
1 y. U+ e) P* ?0 | 10.3.10 NULL操作符
$ g# [, G( N( ] 10.3.11 EMPTY操作符
8 G3 h5 t1 b# i/ t 10.3.12 MEMBER OF操作符 ~, {2 H* a* a; |- N: z4 l$ y
10.4 函数表达式
, e* d Z3 g% _/ B8 ?: @3 p, t1 @+ `' z 10.4.1 字符串函数
2 y3 u: L- `5 \8 D/ I3 w4 F/ d 10.4.2 数值函数
+ g% Y' ^& c. t) }" @: g 10.4.3 日期函数
+ s) a* y; O# Q1 Q/ r/ Y; m4 y 10.5 子查询 ) Z3 Z8 O w: u/ M9 U0 i' ?
10.5.1 基本子查询 ; s4 S/ E/ C% ~8 I2 i+ S
10.5.2 EXISTS表达式 6 ?6 k* S6 p' `. t
10.5.3 ALL和ANY表达式 % U% a/ g& h! u6 q
10.6 分组查询
+ T9 q& K% u# J: J l) e 10.6.1 分组查询基本语法
& {$ I% | Z" _1 w( K4 Y) x! b 10.6.2 分组查询函数
4 K" E; T4 I; M: k M& o$ f- d 10.7 ORDER BY表达式 ) }8 ?" a3 _5 g: t4 F8 L
10.8 批量操作 ( _- h# m1 V9 k* B& u
10.8.1 批量更新 0 E y/ Z! F; F) [7 b7 c1 n
10.8.2 批量删除 + t$ ^/ I; j8 q3 j. S- w& b1 r
10.8.3 执行批量操作
5 \" ~- @! k7 K0 c G- K1 ` 10.9 本章小结
8 ]4 Y {9 V6 C, V: m- w1 i第三篇 JPA高级应用7 } j- |' } q. Z, Y n* {- r) {
第11章 持久化上下文 5 L1 J3 H- O% k6 c$ p
11.1 获得EntityManager对象 / t- C0 w; L; x1 a" m, w
11.1.1 Java EE环境与J2SE环境 " T. [& y- L3 X2 ?
11.1.2 两种类型的EntityManager对象
9 @0 h5 K: A7 i! f& c# ]* o 11.1.3 容器托管的(container-managed)EntityManager对象 7 g& ^# s9 d0 m3 y6 u
11.1.4 应用托管的(application-managed)EntityManager对象 ' ]' A0 B. I9 A9 [' }
11.1.5 ThreadLocal的使用 4 Y2 T! b, p [3 K
11.2 实体管理器工厂(EntityManagerFactory) ; s0 ]7 R- f r) [0 o
11.2.1 javax.persistenc.Persistence API ( {2 h) r; ?* U2 a* Z" f) K: g8 F
11.2.2 EntityManagerFactory API
4 { U& `+ S4 J4 I 11.2.3 实现自己的JPA
8 ^( O [8 Q% V+ }; X' N' o 11.3 容器托管的EntityManager持久化上下文
- Y) F$ ]6 Y6 L/ h% D! m7 A! { 11.3.1 事务范围TRANSACTION % D" f' @1 r: ^
11.3.2 扩展范围EXTENDED $ x# Q+ q- u3 k% [/ I1 k
11.4 事务管理
2 a) s4 d& P. F5 k$ ~, M) X 11.4.1 事务与EntityManager + U8 [8 K( o2 ?8 U# m9 o5 {
11.4.2 JTA管理事务
" y8 }! f8 R5 \/ K9 K; V 11.4.3 RESOURCE_LOCAL管理事务
0 u; A$ r4 P4 O. }- B! S6 t 11.4.4 EntityTransaction API
5 S9 T; W u+ x6 Q4 Y" h( u 11.5 应用托管的EntityManager的持久化上下文
; h- t, ]6 F2 v; e8 @ 11.5.1 无状态的会话Bean与JTA事务(事务范围) 2 _6 Q# g& X' M) o* s, K- [
11.5.2 无状态的会话Bean与JTA事务(扩展范围) ) l1 D9 e/ Q& r7 u4 P
11.5.3 有状态的会话Bean与JTA事务 ' p) _5 J! h8 t4 K) j( q' e
11.5.4 RESOURCE_LOCAL事务 ' |9 I9 i* L" }6 X+ p n# j
11.6 本章小结
( a7 U, J# W5 l 第12章 XML映射文件
# E% U7 \1 n9 x 12.1 XML映射配置VS注释
- F* S. l1 N3 T 12.2 映射文件概述
* T5 E& Q( z0 f, _ 12.2.1 映射文件的保存位置
% Z$ B' H% H! [- o3 u+ n$ K 12.2.2 获取映射文件DTD - f" s" Q/ b) H
12.3 映射基础 3 t, v! r* R# r2 F/ _0 u. L+ a
12.3.1 映射文件的基本结构 2 w0 k6 z7 j, W4 O; K
12.3.2 映射文件的基本元素 % j6 j) p4 G3 K$ B2 _; I
12.4 配置注释< persistence-unit-metadata > . V9 g5 W# H7 w/ Z& \" w. j9 a
12.4.1 禁用注释 * ^; K# ^( [5 S4 @5 b
12.4.2 持久化单元的默认配置
. S6 N4 N, U* U+ k8 ^ 12.5 映射文件的默认配置 ) W: N, \3 P2 W2 R" C i
12.5.1 默认包名 ( ^ f$ e. D f, }, g6 B( b( J
12.5.2 默认schema ) i1 C* u: s" `/ I2 y+ `
12.5.3 默认catalog
( E$ V/ {8 B( t+ H# P b% u 12.5.4 默认访问类型
" c7 q) v! b1 {; q2 M. }% H8 v 12.6 配置查询、生成器和查询结果
% L/ D8 Y. T- }9 u+ F 12.6.1 sequence生成器
+ C# G& u, }7 @9 S 12.6.2 表生成器 + _! v' c6 @3 V+ ~
12.6.3 命名查询
3 c: P2 o! ]" I 12.6.4 本地命名查询
# y; o7 `0 ]: q3 @ 12.6.5 查询结果映射 # t' d; U, _- ?- p# n$ [
2.7 配置实体 ! X% w# S, b# P) c3 k2 f* S
12.7.1 基本配置
: j6 Y3 J5 L4 E. T" \& }8 Z 12.7.2 配置表 1 U) {- ~) x3 l% Y
12.7.3 配置从表 0 B5 d1 j2 q+ o+ O
12.7.4 配置属性 8 |7 y: b% E8 e$ w
12.7.5 配置实体关系 ( M6 S& V: b, _$ `0 |. E
12.8 配置继承 8 H) Y2 T: p" [5 j! C0 `
12.8.1 配置所有实体保存为一个表(SINGLE_TABLE) ! o1 d8 Z6 ^" L& ~$ Z* Q. y
12.8.2 每个实体子类保存在一个表(JOINED)
1 g( f( j$ w0 w# Q 12.8.3 配置非实体类
$ \1 O6 X% g8 m) q! p 12.9 配置嵌入类 1 w+ }2 a" X& s1 v, V A2 J
12.9.1 配置类 c* V. K& ~7 {: M
12.9.2 和配置嵌入实体类 ; a7 K2 P* I' C& r
12.10 配置实体监听器 , E6 ?2 f9 X4 R1 e3 L
12.10.1 监听器定义在实体内
2 Z- t, M& _( L _ 12.10.2 监听器定义在实体外 % A; m/ h, q0 b0 ]# j
12.10.3 禁用父类监听器
/ G7 n" t: u* S 12.10.4 禁用默认监听器
: l( X* ~, l) P 12.11 本章小结 8 q7 J( l1 f2 q3 ^
第13章 打包和部署 0 q7 l( ~( O8 g: V
13.1 Java EE应用打包概述
: F$ W- F2 H2 f# P. g" b 13.1.1 Java EE包的类型 & x5 [# J& |$ f, f
13.1.2 EAR包结构
2 t6 I) A; u( N1 E% N 13.1.3 EJB-JAR包结构 ; k: x% P) j/ y+ ^$ O- I/ e
13.1.4 WAR包结构 ! w6 O: }9 I; B2 q* V' d
13.2 Java EE类加载机制
6 z5 V! t: R8 u, w+ P2 A9 F 13.2.1 Java类加载器 # \) e1 N* A' L% X
13.2.2 类加载顺序模型 7 k( z: H( i& U7 v5 A K' U% ~
13.2.3 Java EE应用的加载顺序
! [; n# T& C& Y; T" l8 k 13.2.4 类加载原理示例 ) n+ S4 x V# ?
13.3 配置persistence.xml + y& _' k4 y6 l) r+ n
13.3.1 保存位置
+ [; I0 }; m; ^# F 13.3.2 persistence.xml的基本结构
) S& p) M% [6 h0 }1 O" n' O 13.3.3 配置持久化单元名称 - O) i9 S: Z6 i1 Y4 w
13.3.4 配置事务类型 C8 H7 P. V( n
13.3.5 配置实现者 . \& a& A. o- f6 w2 B/ k
13.3.6 配置数据源
: }/ R- n. c6 U" y, u 13.3.7 配置映射文件 " [# d$ R# F, d$ y$ r) x
13.3.8 配置管理类 ) S% s7 C$ B/ ~3 Z5 w- e
13.3.9 配置自定义配置 " a" Y# p( x7 d1 v, `! W
13.4 JPA打包最佳实践 * w: S2 M8 U' v- S m
13.4.1 J2SE打包最佳实践
, P7 T+ d+ R, L R% d& c( B 13.4.2 J2EE打包最佳实践——与EJB组件 0 x2 I, ]# A- s6 \' A0 r/ Y) _
13.4.3 J2EE打包最佳实践——与Web应用
* |% ?" W2 N. d8 Q7 B 13.5 本章小结 2 Q7 `4 U1 w# }
第14章 JPA实现框架
5 b% R/ S" i, P 14.1 hibernate JPA / j! B+ p, X$ f/ t
14.1.1 Hibernate 与JPA 8 t3 \9 \3 w+ l, \) J( C
14.1.2 Hibernate下载
' _" ]4 Q/ D. `; h# \ 14.1.3 配置方式 # R6 \4 n7 u3 k/ C9 e
14.1.4 基本配置 6 @. d( F, Q0 p% `, Y: r4 w M
14.1.5 配置日志
0 a3 L& \6 N; b$ F 14.1.6 配置缓存 1 W @0 w$ z7 k* B5 }1 R
14.1.7 配置JDBC和数据库
) v9 }! l) s; y R 14.1.8 其他的常用配置 0 r; p6 z- ^7 V: H
14.2 OpenJPA
, S* ]* L8 S- A# n5 C* ? 14.2.1 OpenJPA与JPA
$ B: p2 u! x, U, c2 e3 S7 p 14.2.2 OpenJPA下载
, U. W8 X: T3 w 14.2.3 配置日志
" u6 T+ \2 P: F- t8 J" Z 14.2.4 配置缓存
5 r5 X9 w" R- M! S$ b% L% k- F 14.2.5 配置JDBC和数据库
9 H! U3 M9 w3 q1 v' O6 h2 T7 | 14.2.6 增强器的使用(Enhancer) / C4 k; u/ _- m7 g! C+ `3 a
14.3 Toplink JPA : q6 m1 \0 h- R# s1 R* k: U
14.3.1 Toplink 与JPA
: h$ N2 w0 U$ H- r, W. j 14.3.2 Toplink下载 4 y6 u$ y2 e' s6 |* Y- V1 {
14.3.3 配置日志
% r% x0 H- E _, B3 N# y. O 14.3.4 配置缓存
/ ]' I6 w Y Q 14.3.5 配置JDBC和数据库
# s: c7 K. V) P 14.3.6 配置DDL # W! e' `4 x% |
14.3.7 其他自定义配置 3 C5 n+ G4 G7 t7 h
14.3.8 配置查询优化
7 @* y w6 n! c1 [ 14.3.9 加载优化
1 z6 w* x: x- i* T! ^- d 14.4 本章小结
! u* D: b9 N& |: s 第15章 JPA与Spring集成 9 O# ]3 U) j. J
15.1 Spring概述 ; g1 {) c- [3 N( P V4 ^6 [$ N/ v
15.1.1 什么是Spring
C% X e' l# a, Q4 b- w3 G- d' R 15.1.2 Spring的特性 + M. i( ?/ z) a+ p \
15.1.3 Spring与JPA
; v! y2 e; @& I 15.2 开始Spring之旅
. t7 z, [8 h/ J0 w7 ^! h 15.2.1 IoC容器
# ]! m# j Z7 {- I. l3 ?# n 15.2.2 普通的Bean
" L, C% k$ j$ J/ |6 ?/ M7 ~ 15.2.3 容器管理的Bean * p' Z7 X* b2 `/ q7 Z& W
15.2.4 在容器中运行 ' x% x' o6 }, G( n, g0 L
15.3 Spring中集成JPA
' z7 F0 ~2 W0 B: T0 K5 i j 15.3.1 集成前的准备
) X( b8 b* T! ?/ }+ F+ R3 g 15.3.2 配置EntityManagerFactory
) M* ?' K" W+ b/ e 15.3.3 配置事务Transaction
$ O6 p8 a0 s6 ^$ V 15.3.4 运行程序
5 s5 W9 L5 _* [# j/ ~1 G 15.4 Spring Web框架
) Z! |# o l+ `* H9 U 15.4.1 Spring Web概述 - q5 y- q/ v, P. R, ?: q* Z
15.4.2 配置Spring Web应用 9 G$ j! a' E E& T6 [4 C
15.4.3 开始Spring Web之旅
; f# ^$ P ]2 Y' Y( e$ R. G( ?/ Q 15.5 Spring Web集成JPA 5 d1 F2 D F6 P4 e
15.5.1 集成前的准备 ( y. J/ V9 K' J, ^
15.5.2 配置数据源
" F i* H3 D: P4 t( x: F 15.5.3 注入业务逻辑
7 ?7 y, a9 T* V3 I; ^# {5 Z3 x 15.5.4 运行程序 $ B1 c' \6 x3 G0 i
15.6 本章小结
4 \8 |/ n& R: m/ t2 {/ J第四篇 典型案例
9 T( M# N% n% X* e- W4 [/ P 第16章 学生成绩管理系统(Servlet+JPA)
( P/ f2 v1 a2 ~0 x' N# P }4 D 16.1 系统概述
8 ?; R; |, [. Z$ l 16.1.1 需求描述 8 V+ Y0 R- r! q; ^
16.1.2 系统预览 : T4 J& E% G3 C) o" K+ w
16.2 系统构架 ' F( k: ^' g/ Z$ K2 I# }
16.2.1 系统结构 : i! H" F9 D& s
16.2.2 CharacterFilter U6 ^. o$ O- T) `
16.2.3 异常处理 $ J/ _: E$ s) L6 O
16.3 数据库设计
3 Y) D* l2 j: y1 w+ T6 l0 R 16.3.1 数据表UML 7 w a9 C( g2 p8 o! z
16.3.2 SQL脚本
& p, w7 |, }6 s, U: }% ]$ v. S 16.4 JPA实体设计
1 }! A. S5 V4 b 16.4.1 JPA实体UML
* W1 @% l8 s& T7 u7 T7 u# Q3 x 16.4.2 JPA实体类代码
6 F$ U8 M! z! X- h 16.4.3 persistence.xml配置
6 O6 O5 ^) T& o8 i( X+ J 16.4.4 JPA实体的部署 5 s5 n+ E$ ~: \+ R. h; u4 u
16.5 班级模块 ! k* Y( z+ F' a/ J9 z3 S
16.5.1 添加页面addClass.jsp ; t! F; v6 f3 n6 F3 G
16.5.2 添加班级 9 u0 V1 Y# Z# z" N: }8 Q+ P0 E
16.5.3 使用标注获取EntityManagerFactory 380
; w* f8 E/ M0 s: x* _# e 16.5.4 班级列表
0 o( h. Y% }2 ? s5 K- R 16.5.5 修改班级 - s* C, u3 l' c4 Q& H8 i2 c
16.5.6 删除班级 ( ~- s( B/ Q- y( a- C2 h* M( S
16.6 课程模块
9 a& m c0 t7 \7 |0 K- Q' J* b 16.6.1 添加、删除、修改课程
' S. Z, b; z0 R& o1 n; D 16.6.2 选择听课学生
5 N2 ]2 J, m7 }% L/ Z& G+ i4 P6 ] 16.7 学生模块
+ X' r; [" C7 x4 m$ v0 [& Y 16.7.1 分页显示学生列表
. h5 E- f6 I6 [2 `6 \ 16.7.2 添加修改删除学生 . U, m1 O0 p+ n7 i2 }1 F
16.8 分数模块
5 l: i6 V6 ~$ h. @% G+ t 16.8.1 添加学生成绩
/ [+ r+ i5 O: x/ W5 f5 Z' ~ 16.8.2 列出学生成绩 7 p% O5 S) X+ F* a+ g( A; k9 H9 o0 D
16.9 本章小结
7 ~9 Y$ T5 b4 R9 _: Q7 j 第17章 宠物商店 (Swing+JPA) + T& I; k" x% K
17.1 系统概述
3 i% U1 m9 d5 R u& e 17.1.1 需求描述
. G/ L7 _, s" {6 b6 n" Q7 m6 U 17.1.2 系统预览
; E) U! j9 B8 U 17.2 系统构架 $ J/ ?, [; R& `1 x+ x4 V* q
17.2.1 系统构架 * {1 o& k* u: x; u) f: q8 N
17.2.2 实体类设计 % i, W: p* T3 i
17.2.3 业务类实现
* h" d$ ]- T: e, M1 \$ V7 C 17.2.4 Session Bean查找 8 k# J7 A/ E4 X2 h$ P: T1 u, Z% u
17.2.5 persistence.xml配置 ) o. S! H* U! H0 _
17.2.6 EJB3组件部署
2 B$ D8 E2 Y" f4 d) T, p 17.3 登录对话框
* y: z% M5 I" l- I9 C% x 17.3.1 登录对话框
0 {# A4 ~0 D0 _. V C. o 17.3.2 异常信息显示
A8 y! ~$ B' W# g5 O* K 17.4 主购物窗口 / o8 n# r& n+ X" K1 E0 d+ P6 H6 `
17.4.1 主购物窗口
( ^! N6 w% H! w! m- _ 17.4.2 主购物窗口代码 + w2 p7 L0 g9 k# d
17.4.3 宠物列表Model
, b# Q! |. E$ L. W' O 17.4.4 添加宠物类别命令
% P. T+ B3 s5 \ k/ z 17.4.5 删除宠物类别命令
% L9 a8 _4 s1 d4 |- ` 17.4.6 添加宠物命令
0 x. s4 E) ~" H7 M$ k1 ]+ D: i. { 17.5 购买窗口
) [1 i& q+ [( I 17.5.1 购买对话框
4 m. z& v- E" u' ^( \$ O 17.5.2 购物车对话框 0 z r& _( S7 ]4 O, l
17.5.3 付款操作 * g) o( M4 ~! ]2 |+ l) o
17.6 本章小结
# L& `$ Z( s) |4 f. |# v! D7 V 第18章 博客系统(Struts2+ Spring2+JPA)
' S- c: w+ f9 g0 x3 \2 a 18.1 系统概述 0 m: q" z0 p3 A; o. `) a4 |9 N
18.1.1 需求描述 ' F- J9 \3 ~9 H6 \8 K. b$ C( g/ R7 q
18.1.2 系统预览 3 J; w3 e6 v& h* Z5 X
18.2 系统构架
8 p9 N, @- A, p ~ 18.2.1 系统构架
) ^6 z; n+ Q; j# |5 J 18.2.2 执行流程 & U7 G! r V, g0 h1 A
18.3 实体类设计 4 B) i0 q/ n3 }3 Y" S0 G0 r- ?
18.3.1 基础实体BaseBean
) D! m) G" F5 ]. H' H0 S0 P 18.3.2 用户实体Person
* g+ d, B+ m" Y/ G! ^) P 18.3.3 爱好实体Hobby
* y7 g$ u4 z7 O 18.3.4 博客实体Blog
; _* w+ ~4 E% E# A, a$ T8 S 18.3.5 类别实体Category M- F: G9 h9 ?0 m$ ^/ B! y' E! v. @
18.3.6 文章实体Post o V4 S; K: ]8 }. s) Y
18.3.7 登录信息类PersonInfo % C8 m; m; E6 \9 ~
18.3.8 persistence.xml
* {7 }. H9 r0 c! p | 18.4 业务模块设计 - d1 v9 D2 g7 C0 x
18.4.1 DAO层接口 ' k. Q8 ~8 Q2 K
18.4.2 DAO层实现 x) _1 D' V3 a, d8 e; Z! [
18.4.3 公共Service层接口 7 U$ r7 p$ s: D: ~$ ], A2 P
18.4.4 公共Service层实现
+ r/ C0 j* z* A- y. j5 s8 F9 g5 O 18.4.5 用户Service接口 9 q! _) Q0 n% ?: O
18.5 用户模块
5 ~. C9 T' Y& ]( J2 b 18.5.1 BaseAction基础类 * h5 a7 i2 N! O9 E
18.5.2 用户注册
2 ?' t1 u& Z3 \0 N+ O' i( G 18.5.3 struts.xml配置
, W" }/ m. g7 u2 `' g5 [ 18.5.4 ApplicationContext.xml配置
- w% G5 ~% i+ n. G i) [ 18.5.5 web.xml配置 4 [6 ]5 f* O5 ~1 Q; ^
18.5.6 register.jsp
2 ^( }& i1 C1 I- ^ 18.5.7 header.jsp,footer.jsp
4 w2 B! T; ]' h+ z 18.5.8 注册表单验证
" y1 f/ U# i6 C* S' ~* v 18.5.9 异常处理
, \' L) [# H; B 18.5.10 用户照片文件上传 $ D! f7 P2 y- v4 L* `8 K* h
18.5.11 用户登录注销
9 `3 P! O; D2 a 18.6 博客模块
2 \. H# K# l0 ^4 | 18.6.1 开通博客 - { \( Y- F$ h
18.6.2 浏览博客
- y3 L' M, e1 g. b# T9 A3 e 18.7 类别模块 6 |6 d4 q" H8 {' j6 i6 Z
18.7.1 类别列表
$ J% w z: D2 P9 A" b) s 18.7.2 添加类别
0 I3 A7 Q3 \3 v/ L/ ~% ] K- D5 ~ 18.7.3 浏览类别 X4 y: b3 J z+ n# Y: V
18.8 文章模块
- [ X$ H* P. e3 O 18.8.1 列出文章
e( i' e6 [% m0 l 18.8.2 添加文章 0 \1 P; e, i$ r4 a: r
18.8.3 浏览文章 6 C% g; `7 d5 P5 I$ N
18.9 本章小结
" E' a, v' `3 c6 q9 V5 B附录A JPA ORM Annotation参考 4 g' \0 s: b! f0 Y0 N+ G i
附录B 其他的JPA Annotation参考
% z9 _2 D6 I3 j4 ~) D9 Y2 J |
|