Hibernate关联映射深度解析:从基础到进阶

4星 · 超过85%的资源 需积分: 10 93 下载量 27 浏览量 更新于2024-07-30 1 收藏 3.12MB PPT 举报
"经典Hibernate教程,全面讲解Hibernate框架,旨在帮助学习者从基础到高级掌握Hibernate的使用技巧。" 在深入探讨Hibernate的关联映射之前,我们先来回顾一下出现的一个常见问题及其解决方案。在尝试加载实体`com.aptech.jb.entity.TblUser`时,系统抛出了`org.hibernate.MappingException: Unknown entity:`异常。这个问题通常意味着Hibernate无法找到对应的实体映射配置。解决方法是在`Hibernate.cfg.xml`配置文件中添加`<mapping resource="com/aptech/jb/entity/TblUser.hbm.xml"/>`,这样Hibernate就能识别并处理该实体。 现在,让我们转向第六章的主题——Hibernate的关联映射。关联映射是Hibernate中非常重要的部分,它允许我们将数据库中的表关系映射到对象之间的关系,实现对象关系映射(ORM)。 1. **一对一关联(One-to-One)**:在一个实体中,一个实例对应另一个实体的唯一实例。这可以通过在映射文件中使用`one-to-one`标签来实现,可以是外键约束,也可以是非外键约束。 2. **一对多关联(One-to-Many)**:一个实体实例可以与多个其他实体实例相关联。这通常通过在一方使用`one-to-many`标签,另一方使用`many-to-one`标签来实现,通常使用列表或集合来存储多方的实例。 3. **多对一关联(Many-to-One)**:多个实体实例可以与另一个实体的单个实例相关联。这与一对多关联相反,需要在多方使用`many-to-one`标签。 4. **多对多关联(Many-to-Many)**:一个实体实例可以与多个其他实体实例相关联,反之亦然。这需要一个中间关联表来存储两个实体的联合键。在Hibernate中,可以使用`many-to-many`标签,并指定中间表的映射。 关联映射中的一些关键属性包括: - `cascade`:定义操作的级联行为,如`save-update`, `delete`, `all`, `none`等。 - `fetch`:定义如何获取关联数据,如`LAZY`(延迟加载)或`EAGER`(立即加载)。 - `inverse`:用于双向关联,表明哪个端负责维护关联。 - `outer-join`:控制是否进行外连接查询,这会影响查询性能。 在使用关联映射时,需要注意避免N+1查询问题,即在获取一个集合时,每个元素都触发一次单独的数据库查询。可以通过设置`fetch`属性为`EAGER`或使用`JOIN FETCH`来优化。 接下来,我们来看一段代码示例,这段代码存在一些错误: ```java Transaction tx = null; Session session = HibernateSessionFactory.getSession(); try { tx = session.beginTransaction(); // session.open() 不是Hibernate的方法,应该是session.beginTransaction() session.insert(item); // 应该使用session.save()或session.saveOrUpdate() session.close(); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } ``` 这段代码中有几个问题: 1. `session.open()`不是一个有效的Hibernate方法,正确的做法是在获取事务之前调用`session.beginTransaction()`来开始一个新的事务。 2. 在Hibernate中,插入新实体应该使用`session.save()`或`session.saveOrUpdate()`,而不是`insert()`方法。 Hibernate的关联映射是其强大功能的核心,通过理解并熟练应用这些关联类型和相关属性,我们可以更有效地将数据库模型转化为对象模型,实现灵活的数据操作。在实践中,不断调试和优化,才能真正掌握Hibernate的精髓。
2009-07-17 上传
目录

前言
1. 翻译说明
1. 在Tomcat中快速上手
1.1. 开始Hibernate之旅
1.2. 第一个可持久化类
1.3. 映射cat
1.4. 与猫同乐
1.5. 结语
2. 体系结构
2.1. 总览
2.2. JMX集成
2.3. JCA支持
3. SessionFactory配置
3.1. 可编程配置方式
3.2. 获取SessionFactory
3.3. 用户自行提供JDBC连接
3.4. Hibernate提供的JDBC连接
3.5. 可选配置属性
3.5.1. SQL Dialects SQL 方言
3.5.2. 外连接抓取(Outer Join Fetching )
3.5.3. 二进制流
3.5.4. 自定义CacheProvider
3.5.5. 事务策略配置
3.5.6. 绑定SessionFactory到JNDI
3.5.7. 查询语言替换
3.6. Logging
3.7. 实现NamingStrategy(命名策略)
3.8. XML配置文件
4. 持久化类(Persistent Classes)
4.1. POJO简单示例
4.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)
4.1.2. 实现一个默认的构造方法(constructor)
4.1.3. 提供一个标识属性(identifier property)(可选)
4.1.4. 建议使用不是final的类 (可选)
4.2. 实现继承(Inheritance)
4.3. 实现equals()和hashCode()
4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks)
4.5. 合法性检查(Validatable)回调
4.6. XDoclet标记示例
5. O/R Mapping基础
5.1. 映射声明(Mapping declaration)
5.1.1. Doctype
5.1.2. hibernate-mapping
5.1.3. class
5.1.4. id
5.1.4.1. generator
5.1.4.2. 高/低位算法(Hi/Lo Algorithm)
5.1.4.3. UUID算法(UUID Algorithm )
5.1.4.4. 标识字段和序列(Identity columns and Sequences)
5.1.4.5. 程序分配的标识符(Assigned Identifiers)
5.1.5. composite-id 联合ID
5.1.6. 识别器(discriminator)
5.1.7. 版本(version)(可选)
5.1.8. 时间戳(timestamp )(可选)
5.1.9. property
5.1.10. 多对一(many-to-one)
5.1.11. 一对一
5.1.12. 组件(component), 动态组件(dynamic-component)
5.1.13. 子类(subclass)
5.1.14. 连接的子类(joined-subclass)
5.1.15. map, set, list, bag
5.1.16. 引用(import)
5.2. Hibernate 的类型
5.2.1. 实体(Entities)和值(values)
5.2.2. 基本值类型
5.2.3. 持久化枚举(Persistent enum)类型
5.2.4. 自定义值类型
5.2.5. 映射到"任意"(any)类型
5.3. SQL中引号包围的标识符
5.4. 映射文件的模块化(Modular mapping files)
6. 集合类(Collections)映射
6.1. 持久化集合类(Persistent Collections)
6.2. 映射集合(Mapping a Collection)
6.3. 值集合和多对多关联(Collections of Values and Many-To-Many Associations)
6.4. 一对多关联(One-To-Many Associations)
6.5. 延迟初始化(延迟加载)(Lazy Initialization)
6.6. 集合排序(Sorted Collections)
6.7. 使用<idbag>
6.8. 双向关联(Bidirectional Associations)
6.9. 三重关联(Ternary Associations)
6.10. 异类关联(Heterogeneous Associations)
6.11. 集合例子(Collection example)
7. 组件(Component)映射
7.1. 依赖对象(Dependent objects)
7.2. 在集合中出现的依赖对象
7.3. 组件作为Map的索引(Components as Map indices )
7.4. 组件作为联合标识符(Components as composite identifiers)
7.5. 动态组件 (Dynamic components)
8. 继承映射(Inheritance Mappings)
8.1. 三种策略
8.2. 限制
9. 操作持久化数据(Manipulating Persistent Data)
9.1. 创建一个持久化对象
9.2. 装载对象
9.3. Querying
9.3.1. 标量查询(Scalar query)
9.3.2. 查询接口(Query interface)
9.3.3. 可滚动迭代(Scrollable iteration)
9.3.4. 过滤集合类(Filtering collections)
9.3.5. 条件查询
9.3.6. 使用本地SQL的查询
9.4. 更新对象
9.4.1. 在同一Session中更新
9.4.2. 更新从session脱离的对象
9.4.3. 把与Session脱离的对象重新绑定
9.5. 删除持久化对象
9.6. 同步(Flush)
9.7. 结束一个Session
9.7.1. 同步(Flush) Session
9.7.2. 提交数据库事务
9.7.3. 关闭Session
9.7.4. 处理异常
9.8. 生命周期和对象图(Lifecyles and object graphs)
9.9. 拦截器(Interceptors)
9.10. 元数据(Metadata) API
10. 事务和并行(Transactions And Concurrency)
10.1. 配置,会话和工厂(Configurations, Sessions and Factories)
10.2. 线程和连接(Threads and connections)
10.3. 考虑对象辨别
10.4. 乐观并发控制(Optimistic concurrency control)
10.4.1. 使用长生命周期带有自动版本化的会话
10.4.2. 使用带有自动版本化的多个会话
10.4.3. 应用程序自己进行版本检查
10.5. 会话断开连接(Session disconnection)
10.6. 悲观锁定(Pessimistic Locking)
11. Hibernate查询语言(Query Language), 即HQL
11.1. 大小写敏感性(Case Sensitivity)
11.2. from 子句
11.3. 联合(Associations)和连接(joins)
11.4. select子句
11.5. 统计函数(Aggregate functions)
11.6. 多态(polymorphism)查询
11.7. where子句
11.8. 表达式(Expressions)
11.9. order by 子句
11.10. group by 子句
11.11. 子查询
11.12. HQL示例
11.13. 提示和技巧(Tips & Tricks)
12. 条件查询(Criteria Query)
12.1. 创建一个Criteria实例
12.2. 缩小结果集范围
12.3. 对结果排序
12.4. 关联(Associations)
12.5. 动态关联对象获取(Dynamic association fetching)
12.6. 根据示例查询(Example queries)
13. 原生SQL查询
13.1. 创建一个基于SQL的Query
13.2. 别名和属性引用
13.3. 为SQL查询命名
14. 性能提升(Improving performance)
14.1. 理解集合的性能
14.1.1. 分类
14.1.2. Lists, maps 和sets用于更新效率最高
14.1.3. Bag和list是反向集合类中效率最高的
14.1.4. 一次性删除(One shot delete)
14.2. 用于延迟装载的代理
14.3. 第二层缓存(The Second Level Cache)s
14.3.1. 对映射(Mapping)缓冲
14.3.2. 策略:只读缓存
14.3.3. 策略:读/写缓存
14.3.4. 策略:不严格的读/写缓存
14.3.5. 策略:事务缓存(transactional)
14.4. 管理Session缓存
14.5. 查询缓存(Query Cache)
15. 工具箱指南
15.1. Schema 生成器(Schema Generation)
15.1.1. 对schema定制化(Customizing the schema)
15.1.2. 运行该工具
15.1.3. 属性(Properties)
15.1.4. 使用Ant(Using Ant)
15.1.5. 对schema的增量更新(Incremental schema updates)
15.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates)
15.2. 代码生成(Code Generation)
15.2.1. 配置文件(可选)
15.2.2. meta属性
15.2.3. 基本的finder生成器(Basic finder generator)
15.2.4. 基于Velocity的渲染器/生成器(Velocity based renderer/generator)
15.3. 映射文件生成器(Mapping File Generation)
15.3.1. 运行此工具
16. 示例:父子关系(Parent Child Relationships)
16.1. 关于collections
16.2. 双向的一对多关系(Bidirectional one-to-many)
16.3. 级联生命周期(Cascading lifecycle)
16.4. 级联更新(Using cascading update())
16.5. 结论
17. 示例:Weblog 应用程序
17.1. 持久化类
17.2. Hibernate 映射
17.3. Hibernate 代码
18. 示例:不同的映射
18.1. 雇员/雇主(Employer/Employee)
18.2. 作者/著作(Author/Work)
18.3. 客户/订单/产品(Customer/Order/Product)
19. 最佳实践(Best Practices)。