hibernate优化

来源:互联网 发布:如何剔除异常数据 编辑:程序博客网 时间:2024/06/05 23:03

1.当一对多关系的时候,由于在保存one方的时候级联保存many方,并且one方负责维护关联关系的话,那么sql的执行顺序是,先保存many方(此时many方的外键是没有值的),然后保存one方,最后将many方的外键改为保存的one的主键这样效率就低了。但是如果由many方来维护关联关系,那么就可以少执行那句update语句了。(首先保存one方,再保存many方,many方在保存自己的时候直接就把外键给设置上了,所以不需要进行update语句来设置外键了)

2.当多对多关系的时候,例如将一个学生,和多门课程关联起来。这时候,操作学生端会效率高一点,因为是由学生端.getCourse().add(course1)和学生端.getCourse().add(course2)来建立关系,这样的话学生端.getCourse()虽然执行了两次,但是由于缓存关系,真正与数据库只交互了一次查询操作。而如果用课程1.getStudent().add(stu1)和

课程2.getStudent().add(stu1)这样的话,他们获取的是各自的学生集合,所以与数据库的查询操作交互了两次。这样效率就低了。


3.user(用户表)和post(岗位表)是一对多   user(用户表)和department(部门表)是多对多  

这时需要查询每一个用户所在的岗位和部门以及用户的自身信息,如果单纯用from user的hql语句查询,则实际会发生3条sql语句,分别是查询user,查询user的post,查询user的department语句。这样做效率很低。我们可以用迫切左外连接来提高效率(不要忘记加fetch,因为不加的话hql查询出来的结果是Object集合,加了的话才会变成对象集合),这时只用一句sql语句就能完成查询三张表所有信息的操作了。查询出来的数据如果重复的话,可以将它放在set集合去重。