我是一个菜鸟,我在学习Hibernate时遇到一个问题:
比如两个类Class(教室),Student(学生)是一对多的关系。并且双向关联,而在Classes的hbm映射中包含Student的set中有属性inverse=true和cascade=all。如果Class中有一个属性需要更新,然后调用了session.update(class);的方法进行更新。Class的那个属性的确是更新了,但是同样也把Class关联的所有的Student更新了一次,比如Class中有60个Student就多更新了60次。但是其实Student中并没有属性改动的。那多发出了这么多更新的SQL语句,肯定要影响性能,我想问问这应该怎么办呀。怎么才能在更新Class时不级联更新Student呢?Classes必须要级联保存Student,但是不需要更新,应该怎么做啊?
1)lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。
2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n+1问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。
cascade=save
经典的N+1问题,哈哈!