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);时候,会删除所有级联的。