Hibernate 里的 lazy和 fetch cascade 和 inverse

chenssss 2011-12-22

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

lazy是延迟加载,默认是延迟加载。

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

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

fetch参数指定了关联对象抓取的方式是select查询还是join查询,

select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,

每一个对象发一个select查询,获取关联的对象,形成n+1次查询;

而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

如果你的关联对象是延迟加载的,它当然不会去查询关联对象。另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定joinfetch某个关联对象。fetch策略用于定义get/load一个对象时,如何获取非lazy的对象/集合。这些参数在Query中无效。

 inverse 属性默认是false的,表示由己方来维护关系。cascade="all" 时候能级联操作(all指定了操作的程度),而none的时候只是维持两者之间的关系(如果inverse="false")

在一对多映射中,一的一方要设<setinverse="true"casecade="save-update"/>,多的一方要设<many-to-oneinverse=false/>

casecade的属性有

1 none:该方式是Hibernate默认的工作模式,不进行级联

2save-update:当执行删除时,没有真正的删除级联,只是把级联的id设为null;

3delete:删除实例的所有的相级联的

4delete-orphan:彻底的删除级联的实例

5 all:当调用session.delete(xx);时候,会删除所有级联的。

相关推荐