本文主要介绍了Hibernate提供的一系列检索对象的方法,包括导航对象图检索、OID检索、HQL检索、QBC检索以及本地SQL检索。同时,还深入探讨了Session缓存的重要性和对象在Hibernate中的三种状态,即临时状态、持久状态和游离状态。
在Hibernate中,对象的状态管理是关键概念之一。Session缓存起着至关重要的作用,它能够存储已持久化的对象,即使应用中的引用变量不再指向这些对象,只要Session未被关闭或清理,对象依然存活。当使用`save()`方法持久化一个对象时,该对象会被添加到Session缓存中。而通过`load()`方法加载对象时,首先会检查缓存中是否存在该对象,如果存在,则直接从缓存中获取,避免了不必要的数据库查询。
对象的状态主要包括以下三种:
1. **临时状态**:新创建的对象处于临时状态,尚未与Session关联,不被Session缓存管理。
2. **持久状态**:通过`save()`或`saveOrUpdate()`方法,对象被持久化并加入Session缓存,其状态变为持久化。即使对象引用被设为null,只要Session未清理,对象依然有效。
3. **游离状态**:持久化对象的Session关闭后,或者从Session中移除后,对象变成游离状态。游离对象可以通过调用`update()`方法重新变为持久化状态。
此外,Hibernate还支持延迟加载(Lazy Loading),这是一种优化策略,允许关联对象在实际需要时才加载,以减少数据库交互。例如,通过导航对象图从Customer对象获取其关联的Orders,如果没有明确启用延迟加载,Orders会在首次访问时自动加载。
检索策略包括:
- **导航对象图检索**:根据已加载对象的关系属性,直接导航到关联的对象。
- **OID检索**:通过对象的唯一标识符(OID)直接获取对象。
- **HQL检索**:使用Hibernate Query Language(HQL),一种面向对象的查询语言,更方便地操作对象和关联。
- **QBC检索**:Query By Criteria API,基于标准Java集合和比较器构建查询,提供了面向对象的接口。
- **本地SQL检索**:直接使用数据库特定的SQL查询,结果由Hibernate映射为持久化对象。
Session缓存能够减少对数据库的访问,提高性能,同时确保缓存中的对象与数据库记录保持一致。在事务提交后,Session通常会清理缓存中已更新或删除的对象,以保持数据一致性。在处理大量数据或长时间运行的事务时,合理管理Session缓存至关重要,以防止内存占用过多。