hibernate真的还是比较花费学习成本的,最近查阅了大量的资料,总算有所收获。在此,总结分享一下令众多初学者晕眩的lazy,inverse,cascade和fetch。
lazy,就是延时加载。
以最简单的parent和child为例子:一个parent可以有多个child,一个child只有一个parent。
当parent类的child属性的lazy为true,那么当select parent的时候,他的child不会马上被select,一直延迟到他的child需要被读写的时候再去select。
当parent类的child属性的lazy为false,那么select parent的时候,他的child会马上被select。
inverse,用于外键维护的控制。
当inverse为false,则在插入表数据之后,会再插入外键维护的记录。
当inverse为true,则在插入表数据的同时,插入外键维护的记录。
在非多对多的表关系中:
还是以parent和child为例子。假设1个parent有3个child,那么:
当inverse为false,则先insert 1 条 parent,再insert 3 条 child,再insert 3 个child的parent ID,一共7次insert。
当inverse为true,则先insert 1 条 parent,再insert 3 条 child,当然这3次insert是同时完成插入parent ID的,所以一共4次insert。
总结:在非多对多的表关系中,inverse永远为ture。
在多对多的表关系中:
中间表的外键维护通常由一方进行维护。
所以2个多方,1个inverse为ture,1个inverse为false。中间表会由inverse为false的一方维护。
总结:选择数据比较多的一方维护中间表的效率会比较高。
cascade,表的级联。
一方面,如果你熟悉数据库,表级联可以设置在数据库上。
另一方面,如果你选择设置在配置文件中,则相应的你的系统会更方便的在各个数据库之间进行移植。
级联具体情况就看业务需求了。关于级联,不明白的可查阅数据库基础理论。没什么好多说的。
fetch,就是加载子表信息所采用的方式,select或者join
以下是我个人对这个属性的理解:
xml配置文件中可以不配置,采用默认的。而他真正的作用在于:
1.通常情况为了保证效率,lazy的配置都是true的。比如有个页面需要显示parent列表,只需要parent的name属性和create time属性,因为不涉及子表信息,lazy为false的配置将大大影响效率。这样,我们就拥有了hibernate的高性能。
2.特殊情况下,我们又希望lazy为false,即当编辑某一个parent的时候,立刻获得parent的子表,乃至孙表的信息(例如当我们采用分层结构时,当信息到视图层时,hibernate的session已经断开了,所以要在逻辑层完成所有信息的载入)。我们就可以在HQL中写left/right outer/inner join fetch实现此功能。这样,我们又获得了临时的灵活性。
转自:http://hi.baidu.com/zh_m_zhou/item/651fe52cb71d0bc2ef10f1e2
相关推荐
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
- **适用场景**: 当需要在配置文件中包含数据库连接信息和映射文件路径时使用。 - **B. `hibernate.properties`** - **特点**: 通常用于硬编码数据库连接信息和添加映射类。 - **示例**: `Configuration config...
- **Configuration**:配置类,负责读取配置文件`hibernate.cfg.xml`并初始化SessionFactory。 - **SessionFactory**:创建Session的工厂,是线程安全的,通常在应用程序启动时创建一个实例,并在整个应用运行期间...
4. **mapping**:在Java ORM中,映射指的是将Java类与数据库表之间的关系建立起来的过程,通常通过XML配置文件或注解实现。 5. **get**和**set**:在Java中,`get`和`set`方法用于访问和修改对象的私有属性,遵循...
4. **fetch策略**:通过`fetch`属性可以指定加载关联的方式,如`FetchType.LAZY`(懒加载)和`FetchType.EAGER`(立即加载)。默认情况下,一对多关系是懒加载的,以避免不必要的性能开销。 5. **级联操作**:通过`...
在User的配置文件中,不直接声明与Account的关联,而是在Account的配置文件中通过`<many-to-one>`标签来定义与User的关联。`name`属性指定了关联属性名,`column`属性指定了外键列名,`class`属性指定了关联类的全...
6. **Fetch Types**: 在Hibernate中,提供了多种方式来获取关联对象:`EAGER`(急切加载)和`LAZY`(惰性加载)。 #### 三、获取数据方法 - **load()**: 用于加载指定主键对应的实体对象。如果对象不在缓存中,则...
- **懒加载与瞬时加载**:可以通过`lazy="true"`(默认)或`fetch="LAZY"`(注解中为`@OneToMany(fetch = FetchType.LAZY)`)实现懒加载,以提高性能,避免一次性加载大量数据。 - **级联操作**:通过`cascade`属性...
- **Hibernate的inverse、cascade、fetch、lazy**:这些是Hibernate的持久化策略,inverse用于管理关联关系的维护,cascade控制操作的级联,fetch决定加载关联数据的方式,lazy是懒加载策略。 这些知识点都是Java...
- **启用方式**:通过设置`fetch="lazy"`属性启用。 #### Session管理 - **生命周期管理**:Session对象的创建、打开、关闭等生命周期管理。 - **事务控制**:通过Session对象控制事务的开始、提交或回滚。 #### ...
- `fetch`:决定如何加载关联数据,`FetchType.LAZY`表示延迟加载,`FetchType.EAGER`表示立即加载。 **多对一关系详解:** 与一对多相反,多对一关系是多个子类实例指向一个父类实例。在上面的用户和订单例子中,...
**第七章**:深入探讨了MVC框架中的代理和配置。 1. **Proxy代理**:代理对象代表目标对象接收请求。 2. **Configuration配置**:定义应用程序的行为和属性。 3. **Interceptor拦截器**:拦截器的作用和实现。 4. *...
在Hibernate中,我们通过在实体类和映射文件中设置注解或XML配置来实现这种关系。 **配置关联** 在Java类中,我们通常使用`@OneToMany`注解来标识一对多关系。此注解包含几个关键属性,如`targetEntity`指定关联的...
在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...
在进行双向关联映射时,我们通常需要配置两个方面:实体类的属性和对应的映射文件。对于User类,我们需要一个Order类型的集合,并在对应的`User.hbm.xml`映射文件中添加`<set>`标签来描述这个关系: ```xml ...
6. **fetch**:这个属性用于控制集合的加载策略,如"EAGER"(立即加载)和"LAZY"(延迟加载)。默认情况下,Hibernate采用懒加载,只在真正需要集合时才去数据库获取数据,以提高性能。 在`s2sh_relation13_...
@OneToMany(mappedBy = "class", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Student> students; // getters & setters } @Entity public class Student { @Id private Long id; @...
在Hibernate中,可以通过@OneToOne注解来定义,可以是外键约束或主键共享,需要配置fetch属性来决定何时加载关联对象,比如LAZY或EAGER。 2. **一对多关联(OneToMany)**:一个实体可以与多个其他实体关联。这通常...