0

1

1.1

1.2

2

2.1

2.2

2.2.1

2.2.2

2.2.3

2.2.4

2.2.5

2.2.6

2.3

2.3.1

2.3.2

2.3.3

2.3.4

2.3.5

2.3.6

2.4

2.4.1

2.4.2

2.4.3

2.5

3

3.1

3.2

3.3

3.4

3.5

4

4.1

4.2

4.3

2

Hibernate 中文文档 3.2

3.4. 可选的配置属性

 

 

4.4

3.4.1. SQL方言

 

4.4.1

3.4.2. 外连接抓取(Outer Join Fetching)

 

4.4.2

3.4.3. 二进制流 (Binary Streams)

 

4.4.3

3.4.4. 二级缓存与查询缓存

 

4.4.4

3.4.5. 查询语言中的替换

 

4.4.5

3.4.6. Hibernate的统计(statistics)机制

 

4.4.6

3.5. 日志

 

 

4.5

3.6. 实现`NamingStrategy`

 

 

4.6

3.7. XML配置文件

 

 

4.7

3.8. J2EE应用程序服务器的集成

 

 

4.8

3.8.1. 事务策略配置

 

4.8.1

3.8.2. JNDI绑定的`SessionFactory`

 

4.8.2

3.8.3. JTA环境下使用Current Session context (当前session上下

)管理

 

4.8.3

3.8.4. JMX部署

 

4.8.4

4 章 持久化类(Persistent Classes)

 

 

5

4.1. 一个简单的POJO例子

 

 

5.1

4.1.1.实现一个默认的(即无参数的)构造方法(constructor

4.1.2.提供一个标识属性(identifier property)(可选) 5.1.2 5.1.1

4.1.3. 使用非final的类 (可选)

 

5.1.3

4.1.4.为持久化字段声明访问器(accessors)和是否可变的标志

(mutators)(可选)

 

 

5.1.4

4.2. 实现继承(Inheritance

 

 

5.2

4.3. 实现`equals()``hashCode()`

 

 

5.3

4.4. 动态模型(Dynamic models)

 

 

5.4

4.5. 元组片断映射(Tuplizers)

 

 

5.5

5 章 对象/关系数据库映射基础(Basic O/R Mapping)

 

 

6

5.1. 映射定义(Mapping declaration

 

 

6.1

5.1.1. Doctype

 

 

6.1.1

5.1.1.1. EntityResolver

 

 

6.1.2

5.1.2. hibernate-mapping

 

 

6.1.3

5.1.3. class

 

 

6.1.4

5.1.4. id

 

 

6.1.5

5.1.4.1. Generator

 

 

6.1.6

5.1.4.2. /低位算法(Hi/Lo Algorithm

 

 

6.1.7

5.1.4.3. UUID算法(UUID Algorithm

 

 

6.1.8

5.1.4.4. 标识字段和序列(Identity columns and Sequences6.1.9

 

 

 

 

 

5.1.4.5. 程序分配的标识符(Assigned Identifiers

 

6.1.10

3

Hibernate 中文文档 3.2

5.1.4.6. 触发器实现的主键生成器(Primary keys assigned by

 

 

 

 

triggers

 

6.1.11

5.1.5. composite-id

 

6.1.12

5.1.6. 鉴别器(discriminator

 

6.1.13

5.1.7. 版本(version(可选)

 

6.1.14

5.1.8. timestamp (可选)

 

6.1.15

5.1.9. property

 

6.1.16

5.1.10. 多对一(many-to-one

 

6.1.17

5.1.11. 一对一

 

6.1.18

5.1.12. 自然ID(natural-id)

 

6.1.19

5.1.13. 组件(component), 动态组件(dynamic-component)

 

6.1.20

5.1.14. properties

 

6.1.21

5.1.15. 子类(subclass)

 

6.1.22

5.1.16. 连接的子类(joined-subclass)

 

6.1.23

5.1.17. 联合子类(union-subclass)

 

6.1.24

5.1.18. 连接(join)

 

6.1.25

5.1.19. (key)

 

6.1.26

5.1.20. 字段和规则元素(column and formula elements

 

6.1.27

5.1.21. 引用(import)

 

6.1.28

5.1.22. any

 

6.1.29

5.2. Hibernate 的类型

 

 

6.2

5.2.1. 实体(Entities)和值(values)

 

 

6.2.1

5.2.2. 基本值类型

 

 

6.2.2

5.2.3. 自定义值类型

 

 

6.2.3

5.3. 多次映射同一个类

 

 

6.3

5.4. SQL中引号包围的标识符

 

 

6.4

5.5. 其他元数据(Metadata)

 

 

6.5

5.5.1. 使用 XDoclet 标记

 

 

6.5.1

5.5.2. 使用 JDK 5.0 的注解(Annotation)

 

 

6.5.2

5.6. 数据库生成属性(Generated Properties

 

 

6.6

5.7. 辅助数据库对象(Auxiliary Database Objects)

 

 

6.7

6 章 集合类(Collections)映射

 

 

7

6.1. 持久化集合类(Persistent collections)

 

 

7.1

6.2. 集合映射( Collection mappings

 

 

7.2

6.2.1. 集合外键(Collection foreign keys)

 

 

7.2.1

6.2.2. 集合元素(Collection elements

 

 

7.2.2

6.2.3. 索引集合类(Indexed collections)

 

 

7.2.3

6.2.4. 值集合于多对多关联(Collections of values and many-to-many

associations)

 

 

7.2.4

4

7.2.5
7.3
7.3.1
7.3.2
7.3.3
7.3.4
7.3.5
7.4
8
8.1
8.2
8.2.1
8.2.2
8.2.3
8.3
8.3.1
8.3.2
8.3.3
8.3.4
8.4
8.4.1
8.4.2

Hibernate 中文文档 3.2

6.2.5. 一对多关联(One-to-many Associations6.3. 高级集合映射(Advanced collection mappings

6.3.1. 有序集合(Sorted collections

6.3.2. 双向关联(Bidirectional associations

6.3.3. 双向关联,涉及有序集合类

6.3.4. 三重关联(Ternary associations

6.3.5. `使用<idbag>`

6.4. 集合例子(Collection example) 第 7 章 关联关系映射

7.1. 介绍

7.2. 单向关联(Unidirectional associations7.2.1. 多对一(many to one)

7.2.2. 一对一(one to one7.2.3. 一对多(one to many

7.3. 使用连接表的单向关联(Unidirectional associations with join tables

7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one

7.3.3. 一对一(one to one7.3.4. 多对多(many to many

7.4. 双向关联(Bidirectional associations

7.4.1. 一对多(one to many) / 多对一(many to one

7.4.2. 一对一(one to one

7.5. 使用连接表的双向关联(Bidirectional associations with join tables

7.5.1. 一对多(one to many/多对一( many to one8.5.1 8.5

7.5.2. 一对一(one to one

 

 

8.5.2

7.5.3. 多对多(many to many

 

 

8.5.3

7.6. 更复杂的关联映射

 

 

8.6

8 章 组件(Component)映射

 

 

9

8.1. 依赖对象(Dependent objects

 

 

9.1

8.2. 在集合中出现的依赖对象 (Collections of dependent objects)

 

9.2

8.3. 组件作为Map的索引(Components as Map indices

 

 

9.3

8.4. 组件作为联合标识符(Components as composite identifiers)

 

 

9.4

8.5. 动态组件 (Dynamic components

 

 

9.5

9 章 继承映射(Inheritance Mappings)

 

 

10

9.1. 三种策略

 

 

10.1

9.1.1. 每个类分层结构一张表(Table per class hierarchy)

 

 

10.1.1

9.1.2. 每个子类一张表(Table per subclass)

 

 

10.1.2

9.1.3. 每个子类一张表(Table per subclass),使用辨别标志

 

 

 

 

 

 

 

5

Hibernate 中文文档 3.2

(Discriminator)

 

10.1.3

9.1.4.混合使用每个类分层结构一张表每个子类一张表10.1.4

9.1.5. 每个具体类一张表(Table per concrete class)

 

 

10.1.5

9.1.6. Table per concrete class, using implicit polymorphism

 

10.1.6

9.1.7. 隐式多态和其他继承映射混合使用

 

 

10.1.7

9.2. 限制

 

 

10.2

10 章 与对象共事

 

 

11

10.1. Hibernate对象状态(object states)

 

 

11.1

10.2. 使对象持久化

 

 

11.2

10.3. 装载对象

 

 

11.3

10.4. 查询

 

 

11.4

10.4.1. 执行查询

 

 

11.4.1

10.4.1.1. 迭代式获取结果(Iterating results)

 

 

11.4.2

10.4.1.2. 返回元组(tuples)的查询

 

 

11.4.3

10.4.1.3. 标量(Scalar)结果

 

 

11.4.4

10.4.1.4. 绑定参数

 

 

11.4.5

10.4.1.5. 分页

 

 

11.4.6

10.4.1.6. 可滚动遍历(Scrollable iteration)

 

 

11.4.7

10.4.1.7. 外置命名查询(Externalizing named queries)

 

 

11.4.8

10.4.2. 过滤集合

 

 

11.4.9

10.4.3. 条件查询(Criteria queries)

 

11.4.10

10.4.4. 使用原生SQL的查询

 

 

11.4.11

10.5. 修改持久对象

 

 

11.5

10.6. 修改脱管(Detached)对象

 

 

11.6

10.7. 自动状态检测

 

 

11.7

10.8. 删除持久对象

 

 

11.8

10.9. 在两个不同数据库间复制对象

 

 

11.9

10.10. Session刷出(flush)

 

 

11.10

10.11. 传播性持久化(transitive persistence)

 

 

11.11

10.12. 使用元数据

 

 

11.12

11 章 事务和并发

 

 

12

11.1. Session和事务范围(transaction scope)

 

 

12.1

11.1.1. 操作单元(Unit of work)

 

 

12.1.1

11.1.2. 长对话

 

 

12.1.2

11.1.3. 关注对象标识(Considering object identity)

 

 

12.1.3

11.1.4. 常见问题

 

 

12.1.4

11.2. 数据库事务声明

 

 

12.2

11.2.1. 非托管环境

 

 

12.2.1

11.2.2. 使用JTA

 

 

12.2.2

6

Hibernate 中文文档 3.2

11.2.3. 异常处理

 

 

 

12.2.3

11.2.4. 事务超时

 

 

 

12.2.4

11.3. 乐观并发控制(Optimistic concurrency control)

 

 

 

 

12.3

11.3.1. 应用程序级别的版本检查(Application version checking)

11.3.2. 扩展周期的session和自动版本化

 

12.3.2

 

 

 

12.3.1

11.3.3. 脱管对象(deatched object)和自动版本化

 

 

 

12.3.3

11.3.4. 定制自动版本化行为

 

 

 

12.3.4

11.4. 悲观锁定(Pessimistic Locking)

 

 

 

 

12.4

11.5. 连接释放模式(Connection Release Modes)

 

 

 

 

12.5

12 章 拦截器与事件(Interceptors and events)

 

 

 

 

13

12.1. 拦截器(Interceptors)

 

 

 

 

13.1

12.2. 事件系统(Event system)

 

 

 

 

13.2

12.3. Hibernate的声明式安全机制

 

 

 

 

13.3

13 章 批量处理(Batch processing

 

 

 

 

14

13.1. 批量插入(Batch inserts

 

 

 

 

14.1

13.2. 批量更新(Batch updates

 

 

 

 

14.2

13.3. StatelessSession (无状态session)接口

 

 

 

 

14.3

13.4. DML(数据操作语言)风格的操作(DML-style operations)

 

 

14.4

14 HQL: Hibernate查询语言

 

 

 

 

15

14.1. 大小写敏感性问题

 

 

 

 

15.1

14.2. from子句

 

 

 

 

15.2

14.3. 关联(Association)与连接(Join)

 

 

 

 

15.3

14.4. join 语法的形式

 

 

 

 

15.4

14.5. select子句

 

 

 

 

15.5

14.6. 聚集函数

 

 

 

 

15.6

14.7. 多态查询

 

 

 

 

15.7

14.8. where子句

 

 

 

 

15.8

14.9. 表达式

 

 

 

 

15.9

14.10. order by子句

 

 

 

 

15.10

14.11. group by子句

 

 

 

 

15.11

14.12. 子查询

 

 

 

 

15.12

14.13. HQL示例

 

 

 

 

15.13

14.14. 批量的UPDATEDELETE

 

 

 

 

15.14

14.15. 小技巧 & 小窍门

 

 

 

 

15.15

15 章 条件查询(Criteria Queries)

 

 

 

 

16

15.1. 创建一个`Criteria` 实例

 

 

 

 

16.1

15.2. 限制结果集内容

 

 

 

 

16.2

15.3. 结果集排序

 

 

 

 

16.3

15.4. 关联

 

 

 

 

16.4

7

Hibernate 中文文档 3.2

15.5. 动态关联抓取

 

 

 

 

 

 

 

16.5

15.6. 查询示例

 

 

 

 

 

 

 

16.6

15.7. 投影(Projections)、聚合(aggregation)和分组(grouping16.7

15.8. 离线(detached)查询和子查询

 

 

 

 

 

 

 

 

16.8

15.9. 根据自然标识查询(Queries by natural identifier)

 

 

 

 

 

 

 

16.9

16 Native SQL查询

 

 

 

 

 

 

 

17

16.1. 使用`SQLQuery`

 

 

 

 

 

 

 

17.1

16.1.1. 标量查询(Scalar queries

 

 

 

 

 

 

17.1.1

16.1.2. 实体查询(Entity queries)

 

 

 

 

 

 

17.1.2

16.1.3. 处理关联和集合类(Handling associations and collections)

 

16.1.4. 返回多个实体(Returning multiple entities)

 

17.1.4

17.1.3

16.1.4.1. 别名和属性引用(Alias and property references)

 

17.1.5

16.1.5. 返回非受管实体(Returning non-managed entities)

17.1.6

16.1.6. 处理继承(Handling inheritance

 

 

 

 

 

 

17.1.7

16.1.7. 参数(Parameters

 

 

 

 

 

 

17.1.8

16.2. 命名SQL查询

 

 

 

 

 

 

 

17.2

16.2.1. 使用return-property来明确地指定字段/别名

 

 

 

 

 

 

17.2.1

16.2.2. 使用存储过程来查询

 

 

 

 

 

 

17.2.2

16.2.2.1. 使用存储过程的规则和限制

 

 

 

 

 

 

17.2.3

16.3. 定制SQL用来createupdatedelete

 

 

 

 

 

 

 

17.3

16.4. 定制装载SQL

 

 

 

 

 

 

 

17.4

17 章 过滤数据

 

 

 

 

 

 

 

18

17.1. Hibernate 过滤器(filters)

 

 

 

 

 

 

 

18.1

18 XML映射

 

 

 

 

 

 

 

19

18.1. XML数据进行工作

 

 

 

 

 

 

 

19.1

18.1.1. 指定同时映射XML和类

 

 

 

 

 

 

19.1.1

18.1.2. 只定义XML映射

 

 

 

 

 

 

19.1.2

18.2. XML映射元数据

 

 

 

 

 

 

 

19.2

18.3. 操作XML数据

 

 

 

 

 

 

 

19.3

19 章 提升性能

 

 

 

 

 

 

 

20

19.1. 抓取策略(Fetching strategies)

 

 

 

 

 

 

 

20.1

19.1.1. 操作延迟加载的关联

 

 

 

 

 

 

20.1.1

19.1.2. 调整抓取策略(Tuning fetch strategies

 

 

 

 

 

 

20.1.2

19.1.3. 单端关联代理(Single-ended association proxies

 

20.1.3

19.1.4. 实例化集合和代理(Initializing collections and proxies

 

19.1.5. 使用批量抓取(Using batch fetching

 

20.1.5

20.1.4

19.1.6. 使用子查询抓取(Using subselect fetching

 

 

 

 

 

 

20.1.6

19.1.7. 使用延迟属性抓取(Using lazy property fetching

20.1.7

19.2. 二级缓存(The Second Level Cache

 

 

 

 

 

 

 

20.2

8

Hibernate 中文文档 3.2

19.2.1. 缓存映射(Cache mappings

 

 

 

20.2.1

19.2.2. 策略:只读缓存(Strategy: read only

 

 

 

20.2.2

19.2.3. 策略:/写缓存(Strategy: read/write

 

 

 

20.2.3

19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write

19.2.5. 策略:事务缓存(transactional

 

20.2.5

 

20.2.4

19.3. 管理缓存(Managing the caches

 

 

 

 

20.3

19.4. 查询缓存(The Query Cache

 

 

 

 

20.4

19.5. 理解集合性能(Understanding Collection performance

 

 

20.5

19.5.1. 分类(Taxonomy

 

 

 

20.5.1

19.5.2. Lists, maps sets用于更新效率最高

 

 

 

20.5.2

19.5.3. Baglist是反向集合类中效率最高的

 

 

 

20.5.3

19.5.4. 一次性删除(One shot delete

 

 

 

20.5.4

19.6. 监测性能(Monitoring performance

 

 

 

 

20.6

19.6.1. 监测SessionFactory

 

 

 

20.6.1

19.6.2. 数据记录(Metrics

 

 

 

20.6.2

20 章 工具箱指南

 

 

 

 

21

20.1. Schema自动生成(Automatic schema generation

 

 

 

 

21.1

20.1.1. schema定制化(Customizing the schema)

 

 

 

21.1.1

20.1.2. 运行该工具

 

 

 

21.1.2

20.1.3. 属性(Properties)

 

 

 

21.1.3

20.1.4. 使用Ant(Using Ant)

 

 

 

21.1.4

20.1.5.schema的增量更新(Incremental schema updates) 21.1.5

20.1.6.Ant来增量更新schema(Using Ant for incremental schema

updates)

 

21.1.6

20.1.7. Schema 校验

 

21.1.7

20.1.8. 使用Ant进行schema校验

 

21.1.8

21 章 示例:父子关系(Parent Child Relationships)

 

 

22

21.1. 关于collections需要注意的一点

 

 

22.1

21.2. 双向的一对多关系(Bidirectional one-to-many)

 

 

22.2

21.3. 级联生命周期(Cascading lifecycle

 

 

22.3

21.4. 级联与`未保存值`Cascades and `unsaved-value`

 

 

22.4

21.5. 结论

 

 

22.5

22 章 示例:Weblog 应用程序

 

 

23

22.1. 持久化类

 

 

23.1

22.2. Hibernate 映射

 

 

23.2

22.3. Hibernate 代码

 

 

23.3

23 章 示例:复杂映射实例

 

 

24

23.1. Employer(雇主)/Employee(雇员)

 

 

24.1

23.2. Author(作家)/Work(作品)

 

 

24.2

9

Hibernate 中文文档 3.2

23.3. Customer(客户)/Order(订单)/Product(产品)

 

 

24.3

23.4. 杂例

 

 

24.4

23.4.1. "Typed" one-to-one association

 

24.4.1

23.4.2. Composite key example

 

24.4.2

23.4.3. 共有组合键属性的多对多(Many-to-many with shared

 

 

 

composite key attribute)

 

24.4.3

23.4.4. Content based discrimination

 

24.4.4

23.4.5. Associations on alternate keys

 

24.4.5

24 章 最佳实践(Best Practices)

 

 

25

10

Hibernate 中文文档 3.2

Hibernate 中文文档 3.2

介紹

11

Hibernate 中文文档 3.2

前言

目录

1. 翻译说明

2. 版权声明

WARNING! This is a translated version of the English Hibernate reference documentation. The translated version might not be up to date! However, the differences should only be very minor. Consult the English reference documentation if you are missing information or encounter a translation error. If you like to contribute to a particular translation, contact us on the Hibernate developer mailing list.

Translator(s): RedSaga Translate Team 满江红翻译团队 <caoxg@yahoo.com>

在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、 浪费时间的。Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/

系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对 象模型表示的对象映射到基于SQL的关系模型数据结构中去。

Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类 型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用 SQLJDBC处理数据的时间。

Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的

95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商 业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中, 它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。不管怎 样,Hibernate一定可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮 你把结果集从表格式的表示形式转换到一系列的对象去。

如果你对Hibernate和对象/关系数据库映射还是个新手,或者甚至对Java也不熟 悉,请按照下面的步骤来学习。

1.阅读1 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的 源代码包含在发行包中,你可以在 doc/reference/tutorial/ 目录下找到。

2.阅读2 章 体系结构(Architecture)来理解Hibernate可以使用的环境。

3.查看Hibernate发行包中的 eg/ 目录,里面有一个简单的独立运行的程序。把 你的JDBC驱动拷贝到 lib/ 目录下,修改一

src/hibernate.properties ,指定其中你的数据库的信息。进入命令行,

切换到你的发行包的目录,输入 ant eg (使用了Ant),或者在Windows操作 系统中使用 build eg

4.把这份参考文档作为你学习的主要信息来源。

5.Hibernate 的网站上可以找到经常提问的问题与解答(FAQ)

前言

12

Hibernate 中文文档 3.2

6.Hibernate网站上还有第三方的演示、示例和教程的链接。

7.Hibernate网站的社区(Community Area)”是讨论关于设计模式以及很多整合方 案(Tomcat, JBoss AS, Struts, EJB,等等)的好地方。

如果你有问题,请使用Hibernate网站上链接的用户论坛。我们也提供一个JIRA问 题追踪系统,来搜集bug报告和新功能请求。如果你对开发Hibernate有兴趣,请加 入开发者的邮件列表。(Hibernate网站上的用户论坛有一个中文版面,JavaEye也 有Hibernate中文版面,您可以在那里交流问题与经验。)

商业开发、产品支持和Hibernate培训可以通过JBoss Inc.获得。(请查阅: http://www.hibernate.org/SupportTraining/)。 Hibernate是一个专业的开放源代码

项目(Professional Open Source project),也是JBoss Enterprise Middleware System(JEMS),JBoss企业级中间件系统的一个核心组件。

前言

13

Hibernate 中文文档 3.2

1.翻译说明

本文档的翻译是在网络上协作进行的,也会不断根据Hibernate的升级进行更新。提 供此文档的目的是为了减缓学习Hibernate的坡度,而非代替原文档。我们建议所有 有能力的读者都直接阅读英文原文。若您对翻译有异议,或发现翻译错误,敬请不 吝赐教,报告到如下email地址:cao at redsaga.com

Hibernate版本3的翻译由满江红翻译团队(RedSaga Translate Team)集体进行,这 也是一次大规模网络翻译的试验。在不到20天的时间内,我们完成了两百多页文档 的翻译,这一成果是通过十几位网友集体努力完成的。通过这次翻译,我们也有了 一套完整的流程,从初译、技术审核一直到文字审核、发布。我们的翻译团队还会 继续完善我们的翻译流程,并翻译其他优秀的Java开源资料,敬请期待。

1. Hibernate v3翻译团队

标题

中文标题

v3翻译

v3审校

v3.

 

 

 

 

 

 

 

 

 

 

 

 

 

Tomcat

 

 

 

 

Quickstart

中快速上

 

 

 

--

(3.1

曹晓钢

zoujm

--

with Tomcat

 

本中取

 

 

 

 

 

 

 

 

 

 

消)

 

 

 

 

 

 

 

 

 

#1

Turtotial

Hibernate

Zheng Shuai

-

Sean

入门

 

 

 

 

 

 

 

 

 

 

 

#2

Architecture

体系结构

Hilton(BJUG)

厌倦发呆

Sean

 

 

 

 

 

 

#3

Configuration

配置

Goncha

mochow

zcgly

 

 

 

 

 

 

#4

Persistent

持久化类

曹晓钢

mochow

Digita

Classes

 

 

 

 

 

 

 

 

 

 

 

 

Basic O/R

对象/关系

 

 

 

#5

数据库映

moxie

Kingfish

张成

Mapping

射基础

 

 

 

 

 

 

()

 

 

 

 

 

 

 

 

 

 

 

对象/关系

 

 

 

 

 

数据库映

inter_dudu

刘国雄(vincent)

张成

 

 

射基础

 

 

 

 

 

 

 

()

 

 

 

 

 

 

 

 

 

#6

Collection

集合类映

曹晓钢

robbin

--

Mapping

 

 

 

 

#7

Association

关联关系

Robbin

devils.advocate

--

Mappings

映射

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 翻译说明

14

Hibernate 中文文档 3.2

#8

Component

组件映射

曹晓钢

Robbin

Song

Mapping

qiang

 

 

 

 

#9

Inheritance

继承映射

morning(BJUG)

mochow

Liang

Mappings

chen

 

 

 

 

 

 

 

 

 

 

#10

Working with

与对象共

程广楠

厌倦发呆

--

objects

 

 

 

 

 

Transactions

事务和并

 

 

 

#11

And

Robbin

mochow

--

 

Concurrency

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#12

Interceptors

继承映射

七彩狼(BJUG)

厌倦发呆

--

and events

 

 

 

 

 

#13

Batch

批量处理

Kingfish(BJUG)

厌倦发呆

--

processing

 

 

 

 

 

 

 

 

 

 

 

 

HQL: The

HQL:

 

 

 

 

Hibernate

 

 

 

#14

Hibernate

郑浩(BJUG)

Zheng Shuai

--

Query

 

查询语言

 

 

 

 

Language

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#15

Criteria

条件查询

nemo(BJUG)

Zheng Shuai

--

Queries

 

 

 

 

 

 

 

 

 

 

 

#16

Native SQL

Native

似水流年

zoujm

--

SQL查询

 

 

 

 

 

#17

Filters

过滤数据

冰云(BJUG)

Goncha

--

 

 

 

 

 

 

#18

XML

XML映射

edward(BJUG)

Goncha

huxb

Mapping

 

 

 

 

 

#19

Improving

性能提升

Wangjinfeng

Robbin

--

performance

 

 

 

 

 

 

 

 

 

 

 

#20

Toolset

工具箱指

曹晓钢

Robbin

--

Guide

 

 

 

 

#21

Example:

示例:父

曹晓钢

devils.advocate

--

Parent/Child

子关系

 

 

 

 

 

 

 

 

 

 

 

Example:

示例:

 

 

 

#22

Weblog

Weblog

曹晓钢

devils.advocate

--

 

Application

应用程序

 

 

 

 

Example:

示例:多

 

 

 

#23

Various

shidu(BJUG)

冰云

--

种映射

 

Mappings

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#24

Best

最佳实践

曹晓钢

冰云

--

Practices

 

 

 

 

 

 

 

 

 

 

 

1. 翻译说明

15

Hibernate 中文文档 3.2

v3.2版本在200611月份由曹晓钢更新。

关于我们

满江红.开源, http://www.redsaga.com

从成立之初就致力于Java开放源代码在中国的传播与发展,与国内多个Java团体及 出版社有深入交流。坚持少说多做的原则,目前有两个团队,“OpenDoc团队翻 译团队,本翻译文档即为翻译团队作品。OpenDoc团队已经推出包括HibernateiBatisSpringWebWork的多份开放文档,并于20055月在Hibernate开放文档 基础上扩充成书,出版了原创书籍:《深入浅出Hibernate》,本书400余页,适合

各个层次的Hibernate用户。(http://www.redsaga.com/hibernate_book.html)敬请支 持。

北京Java用户组, http://www.bjug.org

Beiing Java User Group,民间技术交流组织,成立于20046月。以交流与共享为 宗旨,每两周举行一次技术聚会活动。BJUG的目标是,通过小部分人的努力,形 成一个技术社群,创建良好的交流氛围,并将新的技术和思想推广到整个IT界,让 我们共同进步。

Java视线, http://www.javaeye.com

Java视线在是Hibernate中文论坛( http://www.hibernate.org.cn Hibernate中文 论坛是中国最早的Hibernate专业用户论坛,为Hibernate在中国的推广做出了巨大 的贡献)基础上发展起来的Java深度技术网站,目标是成为一个高品质的,有思想 深度的、原创精神的Java技术交流网站,为软件从业人员提供一个自由的交流技 术,交流思想和交流信息的平台。

致谢

还有一些朋友给我们发来了勘误,在此致谢:Kurapica,李毅,李海林。

1. 翻译说明

16

Hibernate 中文文档 3.2

2.版权声明

Hibernate英文文档属于Hibernate发行包的一部分,遵循LGPL协议。本翻译版本同 样遵循LGPL协议。参与翻译的译者一致同意放弃除署名权外对本翻译版本的其它 权利要求。

您可以自由链接、下载、传播此文档,或者放置在您的网站上,甚至作为产品的一 部分发行。但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明, 并不能违反LGPL协议。这里完整的含义是,不能进行任何删除/增添/注解。若有 删除/增添/注解,必须逐段明确声明那些部分并非本文档的一部分。

2. 版权声明

17

Hibernate 中文文档 3.2

1 Hibernate入门

目录

1.1. 前言

1.2. 第一部分 - 第一个Hibernate应用程序

1.2.1. 第一个class

1.2.2. 映射文件

1.2.3. Hibernate配置

1.2.4. Ant构建 1.2.5. 启动和辅助类

1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射

1.3.1. 映射Person

1.3.2. 单向Set-based的关联

1.3.3. 使关联工作

1.3.4. 值类型的集合

1.3.5. 双向关联

1.3.6. 使双向连起来

1.4. 第三部分 - EventManager web应用程序

1.4.1. 编写基本的servlet

1.4.2. 处理与渲染 1.4.3. 部署与测试

1.5. 总结

1 Hibernate入门

18

Hibernate 中文文档 3.2

1.1.前言

本章是面向Hibernate初学者的一个入门教程。我们从一个使用驻留内存式(in- memory)数据库的简单命令行应用程序开始, 用易于理解的方式逐步开发。

本章面向Hibernate初学者,但需要JavaSQL知识。它是在Michael Goegl所写的 指南的基础上完成的。在这里,我们称第三方库文件是指JDK 1.45.0。若使用 JDK1.3,你可能需要其它的库文件。

本章的源代码已包含在发布包中,位于 doc/reference/tutorial/ 目录下。

1.1. 前言

19

Hibernate 中文文档 3.2

1.2.第一部分 - 第一个Hibernate应用程序

首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。由 于我们使用Java数据库(HSQL DB),所以不必安装任何数据库服务器。

假设我们希望有一个小应用程序可以保存我们希望参加的活动(events)和这些活 动主办方的相关信息。 (译者注:在本教程的后面部分,我们将直接使用event而 不是它的中文翻译活动,以免混淆。)

我们所做的第一件事就是创建我们的开发目录,并且把所有需要用到的Java库文件 放进去。解压缩从Hibernate网站下载的Hibernate发布包,并把 /lib 目录下所有 需要的库文件拷到我们新建开发目录下的 /lib 目录下。看起来就像这样:

.

+lib

antlr.jar

cglib.jar

asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar ehcache.jar hibernate3.jar jta.jar

dom4j.jar

log4j.jar

到编写本文时为止,这些是Hibernate运行所需要的最小库文件集合(注意我们也拷 贝了 Hibernate3.jar,这个是最主要的文件)。你正使用的Hibernate版本可能需要 比这更多或少一些的库文件。请参见发布包中的 lib/ 目录下的 README.txt , 以获取更多关于所需和可选的第三方库文件信息(事实上,Log4j并不是必须的库 文件,但被许多开发者所喜欢)。

接下来我们创建一个类,用来代表那些我们希望储存在数据库里的event

1.2. 第一部分 - 第一个Hibernate应用程序

20

Hibernate 中文文档 3.2

1.2.1. 第一个class

我们的第一个持久化类是一个带有一些属性(property)的简单JavaBean类:

package events;

import java.util.Date;

public class Event { private Long id;

private String title; private Date date;

public Event() {}

public Long getId() { return id;

}

private void setId(Long id) { this.id = id;

}

public Date getDate() { return date;

}

public void setDate(Date date) { this.date = date;

}

public String getTitle() { return title;

}

public void setTitle(String title) { this.title = title;

}

}

你可以看到这个类对属性的存取方法(getter and setter method)使用了标准 JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这 是推荐的设计,但并不是必须的。Hibernate也可以直接访问这些field,而使用访问 方法(accessor method)的好处是提供了重构时的健壮性(robustness)。为了 通过反射机制(Reflection)来实例化这个类的对象,我们需要提供一个无参的构

造器(no-argument constructor)

1.2.1. 第一个class

21

Hibernate 中文文档 3.2

对一特定的event, id 属性持有唯一的标识符(identifier)的值。如果我们希望使 用Hibernate提供的所有特性,那么所有的持久化实体(persistent entity)类(这里 也包括一些次要依赖类)都需要一个这样的标识符属性。而事实上,大多数应用程 序(特别是web应用程序)都需要通过标识符来区别对象,所以你应该考虑使用标 识符属性而不是把它当作一种限制。然而,我们通常不会操作对象的标识

identity),因此它的setter方法的访问级别应该声明private。这样当对象被保存 的时候,只有Hibernate可以为它分配标识符值。你可看到Hibernate可以直接访问 publicprivateprotected的访问方法和field。所以选择哪种方式完全取决于你, 你可以使你的选择与你的应用程序设计相吻合。

所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须 使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是

package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的 情况下,从持久化类里获取数据会更有效率。

把这个Java源代码文件放到开发目录下的 src 目录里,注意包位置要正确。 现在 这个目录看起来应该像这样:

.

+lib

<Hibernate and third-party libraries> +src

+events

Event.java

下一步,我们把这个持久化类的信息告诉Hibernate

1.2.1. 第一个class

22

Hibernate 中文文档 3.2

1.2.2.映射文件

Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库 (database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

一个映射文件的基本结构看起来像这样:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dt

<hibernate-mapping> [...] </hibernate-mapping>

注意HibernateDTD是非常复杂的。你的编辑器或者IDE里使用它来自动完成那些 用来映射的XML元素(element)和属性(attribute)。你也可以在文本编辑器里打 开DTD-这是最简单的方式来概览所有的元素和attribute,并查看它们的缺省值以 及注释。注意Hibernate不会从web加载DTD文件,但它会首先在应用程序的

classpath中查找。DTD文件已包括在 hibernate3.jar 里,同时也在Hibernate发 布包的 src/ 目录下。

为缩短代码长度,在以后的例子里我们会省略DTD的声明。当然,在实际的应用程 序中,DTD声明是必须的。

hibernate-mapping 标签(tag)之间, 含有一个 class 元素。所有的持久化

实体类(再次声明,或许接下来会有依赖类,就是那些次要的实体)都需要一个这 样的映射,来把类对象映射到SQL数据库里的表。

<hibernate-mapping>

<class name="events.Event" table="EVENTS">

</class>

</hibernate-mapping>

到目前为止,我们告诉了Hibernate怎样把 Events 类的对象持久化到数据库

EVENTS 表里,以及怎样从 EVENTS 表加载到 Events 类的对象。每个实例对

应着数据库表中的一行。现在我们将继续讨论有关唯一标识符属性到数据库表的映 射。另外,由于我们不关心怎样处理这个标识符,我们就配置由Hibernate的标识符 生成策略来产生代理主键字段。

1.2.2. 映射文件

23

Hibernate 中文文档 3.2

<hibernate-mapping>

<class name="events.Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native"/>

</id>

</class>

</hibernate-mapping>

id 元素是标识符属性的声明, name="id" 声明了Java属性的名字 - Hibernate 会使用 getId() setId() 来访问它。 column 属性则告诉Hibernate, 我们使

EVENTS 表的哪个字段作为主键。嵌套的 generator 元素指定了标识符生成策 略,在这里我们指定 native ,它根据已配置的数据库(方言)自动选择最佳的标 识符生成策略。Hibernate支持由数据库生成,全局唯一性(globally unique)和应 用程序指定(或者你自己为任何已有策略所写的扩展)这些策略来生成标识符。

最后我们在映射文件里面包含需要持久化属性的声明。默认情况下,类里面的属性 都被视为非持久化的:

<hibernate-mapping>

<class name="events.Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native"/>

</id>

<property name="date" type="timestamp" column="EVENT_DATE" <property name="title"/>

</class>

</hibernate-mapping>

id 元素一样, property 元素的 name 属性告诉Hibernate使用哪个gettersetter方法。在此例中,Hibernate会寻找 getDate()/setDate() ,

getTitle()/setTitle()

为什么 date 属性的映射含有 column attribute,而 title 却没有?当没有设

column attribute 的时候,Hibernate缺省地使用JavaBean的属性名作为字段 名。对于 title ,这样工作得很好。然而, date 在多数的数据库里,是一个保 留关键字,所以我们最好把它映射成一个不同的名字。

另一有趣的事情是 title 属性缺少一个 type attribute。我们在映射文件里声明 并使用的类型,却不是我们期望的那样,是Java数据类型,同时也不是SQL数据库 的数据类型。这些类型就是所谓的Hibernate 映射类型(mapping types),它们能 把Java数据类型转换到SQL数据类型,反之亦然。再次重申,如果在映射文件中没 有设置 type 属性的话,Hibernate会自己试着去确定正确的转换类型和它的映射 类型。在某些情况下这个自动检测机制(在Java 类上使用反射机制)不会产生你所

1.2.2. 映射文件

24

Hibernate 中文文档 3.2

期待或需要的缺省值。 date 属性就是个很好的例子,Hibernate无法知道这个属 性( java.util.Date 类型的)应该被映射成:SQL date ,或 timestamp , 还是 time 字段。在此例中,把这个属性映射成 timestamp 转换器,这样我们 预留了日期和时间的全部信息。

应该把这个映射文件保存为 Event.hbm.xml ,且就在 Event Java类的源文件目 录下。映射文件可随意地命名,但 hbm.xml 的后缀已成为Hibernate开发者社区的 约定。现在目录结构看起来应该像这样:

.

+lib

<Hibernate and third-party libraries> +src

+events

Event.java

Event.hbm.xml

我们继续进行Hibernate的主要配置。

1.2.2. 映射文件

25