Hibernate的延迟加载策略
1.延迟加载的范例
<many-to-onename="departmentInfo"class="com.plane.beans.DepartmentInfo"lazy="false"fetch="select">
2.延迟加载的定义
延迟加载:比如查询一张表时,有外键对应另一张表,可以使用延迟加载,这样就不会把外键对应表的数据加载。lazy是延迟加载,默认是延迟加载。主要是为了系统的性能,当一张表引用到另外一张表时,如果不是立即需要另外一张表的内容,就可以采取延迟加载,直到要用到时才加载另外一张表。延迟加载的作用就是增加系统的性能度,得到你想要的数据,你不想要的数据不会给你查出来
3.手动延迟加载
其实手动延迟加载比较好,又提高了系统的性能,想要的时候就加载,不要就不用具体如下:在取数据的时候代码中写一段就行:
Hibernate.initialize(s.getGradeclass());就行,就代表对象s中加载gradeclass这张表的数据!
4.fetch和lazy
fetch和lazy主要是用来级联查询的。
fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。如果你的关联对象是延迟加载的,它当然不会去查询关联对象。另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定joinfetch某个关联对象。fetch策略用于定义get/load一个对象时,如何获取非lazy的对象/集合。这些参数在Query中无效。
5.cascade和inverse
cascade和inverse主要是用来级联插入和修改的
inverse属性默认是false的,表示由己方来维护关系。cascade="all"时候能级联操作(all指定了操作的程度),而none的时候只是维持两者之间的关系(如果inverse="false")在一对多映射中,一的一方要设
<setinverse="true"casecade="save-update"/>,多的一方要设<many-to-oneinverse=false/>
inverse=true作用:这里关系是由儿子维护的,所以如果只是往父亲里加入儿子,不给儿子设置父亲的话session.save(parent),就不会保存儿子!
因为父亲有个孩子的集合,他无法知道哪个孩子的父亲id已经指向自己了,所以对于每一个孩子,都要更新父亲使他只想自己,而这个关系由孩子维护就好多了,每个孩子只有一个父亲,只有设置过的才需要更新,所以显然,这个父子关系由孩子来维护比较省力,减轻了数据库的负担。