`
- 浏览:
409192 次
- 性别:
- 来自:
北京
-
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,通过在<class>上配置 lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;也就说,对于get、qurey检索,持久化对象都会被立即加载而不管lazy是false还是true.一般来说,我们检索对象就是要访问它,因此立即检索是通常的选择。由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此我个人并不建议使用load检索;而由于<class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用load方法就更没必要了。
关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索,又可分为一对多和多对多、多对一和一对一两种情况讨论。
一对多和多对多关联关系一般使用<set>配置。<set>有lazy和outer-join属性,它们的不同取值绝对了检索策略。
1)立即检索:这是一对多默认的检索策略,此时lazy=false,outer-join=false.尽管这是默认的检索策略,但如果关联的集合是无用的,那么就不要使用这种检索方式。
2)延迟检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方式。
3)迫切左外连接检索:此时 lazy=false,outer-join=true,这种检索策略只适用于依靠id检索方式(load、get),而不适用于query的集合检索(它会采用立即检索策略)。相比于立即检索,这种检索策略减少了一条sql语句,但在Hibernate中,只能有一个<set>配置成 outer-join=true.
多对一和一对一检索策略一般使用<many-to-one>、<one-to-one>配置。<many- to-one>中需要配置的属性是 outer-join,同时还需要配置one端关联的<class>的lazy属性(配置的可不是<many-to-one>中的lazy哦),它们的组合后的检索策略如下:
1) outer-join=auto:这是默认值,如果lazy=true为延迟检索,如果lazy=false为迫切左外连接检索。
2) outer-join=true,无关于lazy,都为迫切左外连接检索。
3) outer-join=false,如果lazy=true为延迟检索,否则为立即检索。
可以看到,在默认的情况下(outer-join=auto,lazy=false),对关联的one端对象Hibernate采用的迫切左外连接检索。依我看,很多情况下,我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id);另外,如果关联对象也采用了迫切左外连接检索,就会出现select语句中有多个外连接表,如果个数多的话会影响检索性能,这也是为什么Hibernate通过 hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索,query的集合检索并不适用,它会采用立即检索策略。
对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,它们的优点在于select语句简单(每张表一条语句)、查询速度快,缺点在于关联表时需要多条select语句,增加了访问数据库的频率。因此在选择即检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。另外,配置文件是死的,但程序是活的,可以根据需要在程序里显示的指定检索策略(可能经常需要在程序中显示指定迫切左外连接检索)。为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
当我们设置Hibernate中的实体属性`lazy=true`时,这是懒加载(Lazy Loading)机制的体现。懒加载是一种优化策略,它允许我们在需要时才加载关联的对象,而不是在初始加载实体时就加载所有关联数据,从而提高性能。 ...
在Spring框架中,`lazy="true"` 是一个重要的特性,用于延迟加载(Lazy Loading)。它主要应用于数据持久层,如Hibernate等ORM框架中,目的是为了提高应用的性能。当一个对象被标记为懒加载时,只有在真正需要访问该...
在Hibernate中,当设置关联属性的`fetch`或`lazy`属性为`true`时,表示该关联属性采用懒加载方式。这意味着,在获取主对象时,Hibernate不会立即加载与其关联的子对象。例如,在用户(User)与帖子(Post)之间的多...
<set name="addresses" inverse="true" lazy="true"> <column name="USER_ID"/> <one-to-many class="Address"/> ``` 这样,当查询`User`对象时,`Address`集合不会立即加载,只有在调用该集合时才会发起...
当我们将一个类或集合的`lazy`属性设置为`true`时,Hibernate会在需要时才去加载关联的对象,而不是在加载主对象时一并加载。这样可以避免不必要的数据库查询,提高性能。 **3. 错误和注意事项** 延迟加载可能导致...
`lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra"`提供更智能的加载策略,推荐在实际应用中使用。 4. 单端关联(One-to-one, many-to-one)的延迟加载:`...
1. **Hibernate集合映射**:介绍如何在映射文件或注解中配置集合的懒加载,如`@OneToMany(lazy = FetchType.LAZY)`或`<set lazy="true">`。 2. **Proxy机制**:解释Hibernate如何创建代理对象,以及这个代理对象...
上述配置中的 `lazy="true"` 属性指明了对该实体启用延迟加载功能。当使用 `session.load()` 方法加载实体时,Hibernate 并不会立即查询数据库,而是返回一个代理对象。这个代理对象包含必要的信息,以便在真正需要...
当使用Hibernate的`Session.load()`方法或在映射文件中设置了`lazy="true"`时,Hibernate并不会立即从数据库中获取关联对象的所有数据,而是创建一个代理对象。这个代理对象在需要访问其属性时才会执行实际的数据库...
在Hibernate中,实体对象的延迟加载可以通过在映射文件中设置`lazy="true"`来启用。例如,对于名为`com.neusoft.entity.User`的实体类,映射配置如下: ```xml <Hibernate-mapping> <class name=...
在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体对象的延迟加载。 例如,对于一个User实体: ```xml <hibernate-mapping> <class name=...
注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合关键字。一个应用程序必须分配它自己的标识符。 使用<composite-id> 标签(并且内嵌元素...
要在Hibernate中启用实体对象的延迟加载,需要在映射文件中为相应的类添加`lazy="true"`属性,例如: ```xml <class name="com.neusoft.entity.User" table="user" lazy="true"> ... ``` **工作原理:** 当执行...
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
- **延迟检索**:通过在`<class>`标签中设置`lazy="true"`来启用。该策略下,只有在真正需要访问关联对象时才进行查询。 - **关联级别检索策略**: - **立即检索**:`lazy="false"`且`outer-join="false"`。默认...
对多关系在 Hibernate 中,多对多关系通常涉及到一个中间表来存储两个实体之间的关联。以下是如何配置 Hibernate 的多对多映射关系。 1. 数据库建表 假设我们有两张表,`users` 和 `roles`,它们通过 `user_roles` ...
在Hibernate中启用实体对象的延迟加载,需在实体的映射配置文件中设置`lazy="true"`属性。例如: ```xml <hibernate-mapping> <class name="net.ftng.entity.user" table="user" lazy="true"> ... </hibernate-...
在Hibernbate配置文件(如`hibernate.cfg.xml`或`.hbm.xml`)中,可以通过设置`lazy="true"`来启用延迟加载。例如: ```xml <class name="com.neusoft.entity.Usertable" lazy="true"> ``` 对于集合属性,同样可以...
在这个例子中,当我们调用`user.getAddresses()`时,由于`@OneToMany(lazy = true)`,Hibernate会执行额外的SQL来获取`Address`列表。 然而,需要注意的是,如果在事物之外访问懒加载属性,可能会抛出`...