现在的位置: 首页 > 综合 > 正文

Hibernate级联关联、抓取策略、延迟加载

2017年12月27日 ⁄ 综合 ⁄ 共 1688字 ⁄ 字号 评论关闭

---设置级联关联CascadeType
链接:http://www.himigame.com/hibernate/822.html
默认情况下有关联的对象,不论任何形式的关系映射,不论单向还是双向,在Session进行持久化时都互不影响也不自动建立集联;
如果需要自动建立集联关系到数据库中,那么在关系映射的注解上设置cascade!如@ManyToOne(cascade={CascadeType.ALL})
大多数情况用CascadeType.MERGE就能达到级联跟新又不报错,用CascadeType.ALL时要斟酌下CascadeType.REMOVE
CascadeType.ALL,//所有操作(删除时不建议使用)
CascadeType.MERGE,//合并
CascadeType.PERSIST,//保存
CascadeType.REFRESH,//刷新
CascadeType.REMOVE  //删除


---Hibernate抓取策略FetchType,延迟加载Lazy
抓取策略是指:当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。
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语句获取一批对象实例或集合。

---链接:http://blog.csdn.net/bluishglc/article/details/5575947
所谓“抓取策略”,总要涉及两个问:何时抓取以及如果抓取。

JPA对抓取策略的描述:
对于fetch=FeatchType.LAZY(延迟加载):何时抓取:lazy,如何抓取:select
对于fetch=FeatchType.EAGER(立即加载):何时抓取:eager,如何抓取:join
hibernate还提供一种subselect抓取,它是配合lazy=true的抓取方法。
如果想要使用subselect抓取,你可以用hibernate的FetchMode.SUBSELECT注解覆写JPA的配制,但是lazy=true这一点,你还是需要使用fetch=FetchType.LAZY来配制的

在CUD操作时要有级联效果得使用cascade,而在R读取时区分是否延迟加载要用fetch。

默认情况下,@ManyToOne取Many的对象时,对应One一方的对象会被自动取出来;
默认情况下,@OneToMany取One的对象时,Many一方的对象不会取出来;
如果需要设置延迟加载(懒加载)可以使用fetch;
例如:
//级联保存,删除等  
//FetchType.EAGER 不延迟,立即加载关联对象  
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)  private Set<Client> clients;
@LazyCollection(LazyCollectionOption.EXTRA)  private Set<Rider> riders;
@Fetch(FetchMode.SUBSELECT) private Set<Client> clients;

抱歉!评论已关闭.