1.任何定义关联关系的Annotation都有cascade和fetch两个属性。cascade负责CUD,fetch负责R
2.Read的情况,OneToMany的时候,他不会取出many的数据。但当ManyToOne的时候,会自动取出One的数据。为什么呢?举个例子:一个老师有50各学生,当你要取出50个学生的数据时,顺便取出老师的数据是顺其自然的。但如果你想取出老师的数据,你不会把所有的50个学生的数据全部取出来吧?!就是这个道理。可以手动设定fetch属性自行取得
3.当fetch="lazy"的时候,比如已经取出了老师的数据,除非你手动去取 [老师.学生]的时候,hibernate才会取出学生的数据,但有一个前提,必须是在session关闭之前,如果session关闭之后再去取的话,会报session关闭异常
4.经验证明,不要在两方同时把fetch设定为EAGER。不然会出现很多重复的数据库操作。举例:把学生的设为EAGER。取学生的时候就会自动把老师的数据取出来,但由于老师那边也是设定为了EAGER,所以又会去取学生,这样就重复了。XML中,在set上设定inverse="true",就相当于设定fetch=LAZY。
5.在主表里定义从表的属性时,可以定义成为很多种类型(常见的Set,List,Map)。其中,Set不会保存重复数据。List有顺序,因此可以设定@OrderBy。Map是标准的健值对,因此需要通过@MapKey来设定健对应的字段名。