一、级联(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。