`

Hibernate 里的 lazy和 fetch cascade 和 inverse

 
阅读更多

fetch 和 lazy 主要是用来级联查询的,
而 cascade 和 inverse 主要是用来级联插入和修改的

lazy是延迟加载,默认是延迟加载。
主要是为了系统的性能,当一张表引用到另外一张表时,如果不是立即需要另外一张表的内容,就可以采取延迟加载,直到要用到时才加载另外一张表。

延迟加载的作用就是增加系统的性能度,得到你想要的数据,你不想要的数据不会给你查出来

fetch参数指定了关联对象抓取的方式是select查询还是join查询,
select方式时先查询返回要查询的主体对象(列表),再根据关联外键 id,
每一个对象发一个select查询,获取关联的对象,形成n+1次查 询;
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。 另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用 select方式,除非你在hql中指定join fetch某个关联对象。fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

 inverse 属性默认是false的,表示由己方来维护关系。cascade="all" 时候能级联操作(all指定了操作的程度),而none的时候只是维持两者之间的关系(如果inverse="false")
      在一对多映射中,一的一方要设<set inverse="true" casecade="save-update" />,多的一方要设<many-to-one inverse=false />

casecade的属性有

1 none:该方式是Hibernate默认的工作模式,不进行级联
2 save-update:当执行删除时,没有真正的删除级联,只是把级联的id设为null;
3 delete:删除实例的所有的相级联的
4 delete-orphan:彻底的删除级联的实例
5 all:当调用session.delete(xx);时候,会删除所有级联的。


分享到:
评论

相关推荐

    hibernate

    根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...

    Hibernate笔记

    6. **Fetch Types**: 在Hibernate中,提供了多种方式来获取关联对象:`EAGER`(急切加载)和`LAZY`(惰性加载)。 #### 三、获取数据方法 - **load()**: 用于加载指定主键对应的实体对象。如果对象不在缓存中,则...

    Hibernate双向一对多

    @OneToMany(mappedBy = "class", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List&lt;Student&gt; students; // getters & setters } @Entity public class Student { @Id private Long id; @...

    Hibernate关联关系疑问

    在Hibernate中,可以通过@OneToOne注解来定义,可以是外键约束或主键共享,需要配置fetch属性来决定何时加载关联对象,比如LAZY或EAGER。 2. **一对多关联(OneToMany)**:一个实体可以与多个其他实体关联。这通常...

    hibernate总结

    - **一对多**:在映射文件中,通过 `&lt;set&gt;` 标签定义一对多关系,并可通过 `inverse`、`cascade`、`lazy` 和 `fetch` 控制行为。 - **多对一**:通过 `&lt;many-to-one&gt;` 标签定义,可设置 `fetch` 和 `cascade` 属性。...

    hibernate的多种映射关系

    这通过 `cascade` 参数在 `@OneToMany` 和 `@ManyToOne` 注解中配置。 7. **懒加载与立即加载 (Lazy Loading vs Eager Loading)** Hibernate 提供了两种加载策略:懒加载(默认)只在需要时加载关联数据,而立即...

    hibernate 多对多操作

    在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...

    Hibernate使用技巧汇总

    - 需要在两边都设置`inverse`和`lazy`。 - `cascade`只能设置为`insert-update`。 - **示例**: - `group1.getRoles().add(role1);` - `role1.getGroups().add(group1);` - 分别保存`role1`和`group1`。 #### ...

    Hibernate_h_源码

    4. **fetch策略**:通过`fetch`属性可以指定加载关联的方式,如`FetchType.LAZY`(懒加载)和`FetchType.EAGER`(立即加载)。默认情况下,一对多关系是懒加载的,以避免不必要的性能开销。 5. **级联操作**:通过`...

    Hibernate(一对多表操作)

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private Set&lt;Order&gt; orders; ``` 这样,只有在真正访问`orders`集合时,Hibernate才会去数据库查询订单。 ### 5. 级联操作 通过设置`CascadeType`,可以...

    Hibernate 相关映射关系

    通过`@OneToMany`注解来配置,可以设置`fetch`策略(如LAZY或EAGER),以及`cascade`属性来决定操作的级联性。例如,一个部门可以有多个员工,Department实体中有一个Employee列表。 3. **多对一映射(Many-to-One...

    hibernate 一对多关联

    - **懒加载与瞬时加载**:可以通过`lazy="true"`(默认)或`fetch="LAZY"`(注解中为`@OneToMany(fetch = FetchType.LAZY)`)实现懒加载,以提高性能,避免一次性加载大量数据。 - **级联操作**:通过`cascade`属性...

    hibernate关联映射的作用和常用属性解释

    为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解其常用的属性及其作用。 ##### 1. `&lt;class&gt;`元素 - **`name`**:指定类的完整包名,如`com.example.Person`。 - **`table`**:对应数据库中的...

    Hibernate教程16_集合映射

    6. **fetch**:这个属性用于控制集合的加载策略,如"EAGER"(立即加载)和"LAZY"(延迟加载)。默认情况下,Hibernate采用懒加载,只在真正需要集合时才去数据库获取数据,以提高性能。 在`s2sh_relation13_...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    Hibernate一对多映射配置详解

    3. `fetch`属性:用于指定关联数据的加载策略,如`EAGER`(立即加载)或`LAZY`(延迟加载)。 4. 外键约束:在数据库中,可以设置外键约束以确保数据一致性,但不是必须的,Hibernate可以通过程序逻辑实现数据一致性...

    Hibernate一对多

    另外,使用`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy ..., fetch = FetchType.LAZY)`可以实现懒加载,只在需要时加载子对象集合,减少内存消耗。 **六、总结** 理解并熟练掌握...

    hibernate中一对多配置

    - `fetch`:决定如何加载关联数据,`FetchType.LAZY`表示延迟加载,`FetchType.EAGER`表示立即加载。 **多对一关系详解:** 与一对多相反,多对一关系是多个子类实例指向一个父类实例。在上面的用户和订单例子中,...

    Hibernate学习之 : 一对多关联映射

    &lt;set name="orders" table="orders" inverse="true" lazy="true" cascade="all"&gt; ``` 而在`Order`的映射文件中: ```xml ``` **示例应用** 为了更好地理解,我们可以创建一个简单的示例。首先,创建`...

    hibernate一对多关联映射(双向关联)

    这里的`inverse="true"`表示该端是被管理端,`cascade="all"`表示级联操作,意味着用户对象的任何更改(包括删除)都会影响到关联的订单。 在Order类中,我们需要添加一个User类型的属性,并在`Order.hbm.xml`映射...

Global site tag (gtag.js) - Google Analytics