外键维护
当使用Hibernate框架处理多表关联问题时,会遇到外键维护问题!也就是对应于<many-to-one><set>标签中的inverse属性,该属性是用于指出是否不参与外键维护,默认值为false!举例说明,当把主键映射配置文件中set标签的inverse属性设置为true时,主键所对应的对象就不参与外键维护,也就是说主键不会执行update语句,用于维护外键!
SQL优化
由于Hibernate并不知道每一句SQL语句的具体含义,它只是在底层根据代码执行情况,进行了机械的SQL拼接并执行SQL!所以会出现很多并不必要的SQL执行,这无疑会造成SQL性能的浪费!所以在编程中应尽量减少不必要的SQL执行!
举个例子:用户与订单是一对多的关系,当我们使用Hibernate保存数据时,假设用户与订单都已相互设置关联且用户与订单都能维护外键(即inverse=false),那么根据不同的代码执行逻辑会执行不同数量的SQL语句!
session.save(order_1);
session.save(order_2);
session.save(customer);
按照这个执行顺序,会执行7条SQL语句,分别为3条INSERT语句(用于向数据库插入数据),4条UPDATE语句(订单两条,用户两条分别用于维护外键).
session.save(customer);
session.save(order_1);
session.save(order_2);
而当我们先存储用户(主键),会执行5条SQL语句,分别为3条INSERT语句(用于向数据库插入数据),2条UPDATE语句(用户发送的两条用于维护外键.
而当我们去除用户中的订单数据(即去除外键),再按以上顺序进行数据存储时,就只会执行3条SQL语句.
所以,根据以上现象,我们可以得出Hibernate维护外键的规律.
在inverse均为false的情况下:
对于主键(主表)对象:
1/配置条件,即已在主键配置文件中配置了外键信息;
2/向主键对象中添加外键对象(对应在用户中添加订单信息);
只要满足这两条,主键便会维护外键
对于外键(从表)对象:
1/配置条件,即已在主键配置文件中配置了外键信息;
2/向主键对象中添加外键对象(对应在用户中添加订单信息);
3/外键对象(订单)缺失数据(一般都是缺失外键信息);
只有满足以下三个条件,从表对象才会维护外键,即发送UPDATE语句.