ManyToOne单向




测试add:


先添加为one的一方,再添加为many的一方,共需要三条sql语句,
先添加为many的一方,再添加为one的一方,共需要五条sql语句,增加了更新语句
所以最佳实践:一定要先添加一的一方,之后再添加多的一方
测试load:

load加载时:关联对象的加载也是延迟的。
测试cascade=all的用处:

没有添加cascade=all的时候:抛出异常。

当添加了cascade之后,不会抛出异常。
但是同时cascade也会造成一些问题,在删除的时候:

上述删除会抛出异常。原因如下:
如果删除的时候,cascade也会把关联的对象删除,但是对于多对一的情况来说,删除一个也会把关联的唯一一个删除,但是又因为还有其他对象在关联,所以删除不掉这个关联对象,导致这个对象也删除不掉,抛出异常,造成灾难。
所以没有特殊情况,不要使用cascade。
一般使用cascade的地方都是一One的地方进行删除时使用,特殊情况才使用cascade的add,正常情况add都是由程序员完成添加的
多Many的地方不建议使用cascade.
OneToMany单向
One:

Many

映射文件:


测试add:

load测试:

注意:使用lazy="extra"会稍微智能,会根据取值的不同来判断是调用count还是投影

特别注意oneToMany在添加和维护关系的时候比较麻烦,所以在开发中不建议使用oneToMany的单向。
ManyToOne双向
实体类


映射文件:


测试add
使用一的一端来维护关系:

结论:此处会生成五条sql语句,所以最佳实践是,先添加一的一方,再添加多的一方,不要使用一的一方来维护关系.
实施方法:在配置文件的set中可以通过设置inverse=true来明确不使用一的这一端来维护关系

使用inverse=true的时候会生成三条sql语句,因为不会应为cr的增加而去更新student的表。
不去维护关系,自然就少了两条sql语句,但是同时由于在一的一端来添加,又inverse=true,所以会造成关联失败。这就需要程序员自己主动使用多的一方来维护关系。
使用多的一端来维护关系:

测试load:

因为有关联关系的存在都可以取出来数据。
网友评论