文档章节

CUDR_Fetch 和 Cascade

bigYuan
 bigYuan
发布于 2014/10/22 17:22
字数 843
阅读 31
收藏 0


1.Fetch的作用:在联接查询中,它是一次性的将两张表的作为一张表,全部 
加载;fetch用于查找同步,cascade用于增删改同步(如果是多对多的情况,A主控端cascade没有设置的话,比如在删除数据时,中间表数据同时也会被删除,如果设置了cascade.REMOVE的话,连同B被控端的数据也一同被删除,和一对多稍微有点区别)  还有一点需要注意:被控端如果没有设置 cascade.REMOVE的话,在删除B被控端数据时,会报一个外键异常。总的来说,多对多的场合,如果没有设置 cascade.REMOVE的话,A主控端在删除数据时,中间表数据也一并被删除,B被控端在删除数据时会报外键异常;如果设置了 cascade.REMOVE的话,主控端和被控端在删除时据时效果是一样的。 (主控和被控的概念是针对的中间表操作, cascade是针对被控表和主控表操作,所以多对多的时候,两方都可能设置成主控

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

2.例子:
Java代码  
  1. group类  
  2. @OneToMany(mappedBy="group",cascade={CascadeType.ALL},fetch=FetchType.LAZY)  //OneToMany  默认fetch为LAZY  当查询小组时,不会从user表里查询出该小组的所有组员,当group.getUsers().get(0).getName()此时ORM框架会向数据库发出查询语句  
  3. public Set<User> getUsers() {return users;}   
  4.   
  5.   
  6. user类  
  7. @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //ManyToOne   默认Fetch为EAGER 当查询的时候会把该user所在的小组也查询出来  
  8. public Group getGroup() { return group;}   

   CRUD即create(创建)、Read/Retrieve(读取)、Update(更新)和Delete(删除) 
   Cascade用于设置CUD 
   Cascade.all在所有情况下级联。 
    Cascade.MERGE合并 save update 
   Cascade.PERSIST保存 
    Cascade.REFRESH刷新 
    Cascade.REMOVE删除 
    Fetch用于设置R 
    Fetch.EAGER主动的积极 
    Fetch.LAZY懒 

3.cascade不管读,fetch管读 ,fetch:lazy和eager,只是取得早晚问题,用到的时候一定能取得 
在一对多双向关联时 
读少的一方时,里面存的多的不会自动加载,lazy 
读多的一方时,里面存的少的会自动加载,因为它少eager 


4.重要结论   
要想关联,得设置好对象的关联 
   从多端user保存,先手工保存dept,否则抛TransientObjectException异常。 
   除非设置cascade属性 
   从一端保存,除非设定mappedBy并且设定CascadeType.ALL并且从两端 
   正确设定关联关系,否则不会自动级联保存User 
双向关系需加入mappedBy 
Cascade有5种: ALL、MERGE、PERSIST、REFRESH、REMOVE   
Cascade并非不用不可。 
Cascade不影响 读取 ,只影响 对象的持久化 (添加,删除,修改) 
Fetch有2种: EAGER LAZY
   多端默认是 EAGER ,一端默认是 LAZY  
Fetch影响读取 
Session关闭,lazy就不好使了 
EJB3为延迟加载和获取模式提供了fetch选项,而Hibernate 这方面提供了更丰 
富的选项集.为了更好的调整延迟加载和获取策略,Hibernate引入了 一些附加 
的注解: 
   @LazyToOne:  
   @LazyCollection:  
   @Fetch :  
JPA的Fetch,既管延迟加载的事情,又管抓取策略的事情。 
   延迟加载:sql语句尽量晚发出 
 抓取策略:靠什么样的sql,找到关联的对方 

本文转载自:http://ewf-momo.iteye.com/blog/1691686

bigYuan
粉丝 17
博文 135
码字总数 43172
作品 0
大连
程序员
私信 提问
JPA ManyToMany查询结果重复

photo 与 serviceItem 之间是many to many的关系 @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.REFRESH }) @Basic(fetch = FetchType.LAZY) @JoinCol......

五月民
2012/05/29
3K
1
ssh级联添加,雾霾求蓝天

ssh框架做的,客户表和联系人表,主外键,关联也建好了,添加时,联系人表添加完整,客户表里的联系人外键为空,求牛人给个解释,万分感谢 联系人配置 客户配置 求个解释,拜托了各位大哥大嫂...

blueshy
2015/02/28
256
2
hibernate 表关联 多对一 一对多 多对多 注解 xml

首先是xml文件配置的多对一: <many-to-one name="brand" column="brand" class="com.tch.model.Brand" /> brand是实体类中的属性,class对于类的全称 column对于外键 xml文件配置的一对多:......

小和尚敲代码
2016/02/04
13
0
Hibernate OneToMany 的问题

Hibernate中@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) cascade = CascadeType.ALL和fetch = FetchType.LAZY对性能都有提升吗?,如果有提升是怎样提升?...

淡定的米哥
2014/09/25
96
0
hibernate 级联保存 8条数据 子表有的时候保存4条 有的时候保存3条

hibernate 级联保存 8条数据 本地保存可以保存8条,服务器保存有的时候保存4条,有的时候保存8条 主表 @Entity @Table(name = "salas_log") @Cache(usage = CacheConcurrencyStrategy.NONST...

alicas
2015/07/23
186
0

没有更多内容

加载失败,请刷新页面

加载更多

通过微服务来正确实施SOA

对于组织来说,能够构建、发展和扩展大型应用程序是至关重要的, 但所涉及的挑战使其成为一项艰巨的任务。正因为如此, 微服务凭借能够将单个组件拆分成围绕特定业务功能的独立服务,已成为构建...

Linux就该这么学
13分钟前
2
0
从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路

2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台。该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部分...

阿里云官方博客
16分钟前
1
0
使用python来操作redis用法详解

1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的red...

dragon_tech
16分钟前
2
0
给研发工程师的代码质量利器 | SOFAChannel#5 直播整理

> SOFA:Channel,有趣实用的分布式架构频道。 > > 本文根据 SOFAChannel#5 直播分享整理,主题:给研发工程师的代码质量利器 —— 自动化测试框架 SOFAActs。 > > 回顾视频以及 PPT 查看地址...

SOFAStack
18分钟前
1
0
段错误总结

https://blog.csdn.net/e_road_by_u/article/details/61415732 一、段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问...

悲催的古灵武士
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部