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