ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 19.1\. 抓取策略(Fetching strategies) _抓取策略(fetching strategy)_ 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或`条件查询(Criteria Query)`中重载声明。 Hibernate3 定义了如下几种抓取策略: * _连接抓取(Join fetching)_ - Hibernate通过 在`SELECT`语句使用`OUTER JOIN`(外连接)来 获得对象的关联实例或者关联集合。 * _查询抓取(Select fetching)_ - 另外发送一条 `SELECT` 语句抓取当前对象的关联实体或集合。除非你显式的指定`lazy="false"`禁止 延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。 * _子查询抓取(Subselect fetching)_ - 另外发送一条`SELECT` 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定`lazy="false"` 禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。 * _批量抓取(Batch fetching)_ - 对查询抓取的优化方案, 通过指定一个主键或外键列表,Hibernate使用单条`SELECT`语句获取一批对象实例或集合。 Hibernate会区分下列各种情况: * _Immediate fetching,立即抓取_ - 当宿主被加载时,关联、集合或属性被立即抓取。 * _Lazy collection fetching,延迟集合抓取_- 直到应用程序对集合进行了一次操作时,集合才被抓取。(对集合而言这是默认行为。) * _"Extra-lazy" collection fetching,"Extra-lazy"集合抓取_ -对集合类中的每个元素而言,都是直到需要时才去访问数据库。除非绝对必要,Hibernate不会试图去把整个集合都抓取到内存里来(适用于非常大的集合)。 * _Proxy fetching,代理抓取_ - 对返回单值的关联而言,当其某个方法被调用,而非对其关键字进行get操作时才抓取。 * _"No-proxy" fetching,非代理抓取_ - 对返回单值的关联而言,当实例变量被访问的时候进行抓取。与上面的代理抓取相比,这种方法没有那么“延迟”得厉害(就算只访问标识符,也会导致关联抓取)但是更加透明,因为对应用程序来说,不再看到proxy。这种方法需要在编译期间进行字节码增强操作,因此很少需要用到。 * _Lazy attribute fetching,属性延迟加载_ - 对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取。需要编译期字节码强化,因此这一方法很少是必要的。 这里有两个正交的概念:关联_何时_被抓取,以及被_如何_抓取(会采用什么样的SQL语句)。不要混淆它们!我们使用`抓取`来改善性能。我们使用`延迟`来定义一些契约,对某特定类的某个脱管的实例,知道有哪些数据是可以使用的。