关于hibernate的lazy、inverse和fetch属性的测试

一、级联(cascade)

1.对于级联来说,其目的就是问了支持性操作,即只调用一个session相关联的的方法(如:get/save/update/hql),可以完成多个方法组合完成的任务。

2.在相互关联的时候,一定要记得填充相互关联的集合或对象,如class对象中的Students集合或student对象中的Class对象。

3.若有一对多级联Class和Student,那么对于托管后重新持久化的对象(如使用update)或者持久化对象(如使用get而非save)在执行属性的修改变动的时候处理方式很简单,而对于处理其关联的集合的时候(Class中的Students集合)有一个必须注意的问题,就是说hibernate在数据库中得到数据并映射到实体中已经初始化好了一个集合对象,那么这个集合的内存地址是不能变动的(即不能class.setStudents(null),或new一个新的集合),正确做法是class.getStudents().remove(obj)或class.getStudents().clear()或class.getStudents().add(collection/obj)

二、各种标签上的属性

1.not-null:在property标签上默认为false,但是在集合中的key标签中not-null的默认值不再是false而是true,然而唯一在单向一对多关系中key的not-null默认值是false。故在使用的过程中,只需要注意在单向的一对多中加上not-null="true"就行了。

2.lazy:在property和集合上的lazy就不必多说了,偶尔会用到的在class标签中加入的属性lazy=false是作用在load方法上的。

3.inverse:一般在双向一对多中中的一方使用inverse=true,但是也有特殊情况不能这样使用,比如:该集合为list集合,因为数据库中有list-index字段的存在,所以如果使用了inverse=true则数据库中的该字段始终为null。还有就是单向一对多不能使用,因为多方中没有实体对象提供id(如student.getClass.getId())。

4.fetch:出现在集合或many to one上,首先fetch默认为select,采取每个表一条dql,若设置为join,则采取外联抓取只产生一条dql。另外,fetch=join是针对get方法并且无视lazy=proxy或lazy=false,若lazy=false(lazy=false只针对hql),那么也会影响get方法,但是没实用价值,并且无论是fetch=join还是lazy=false都不会影响load方法,影响load方法的只有class标签上的lazy=false。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值