Hibernate提高性能的几点建议
 1.尽量少用one-to-many的映射,如果用最好把lazy设置成true,这样在查询主表时其关联子表就不会被查询,从而节约数据库的资源。
2. 当lazy设置为true时,如果需要(用Criteria或者DetachedCriteria)查询子表对象,则会抛出一个session closed的异常,因为Hibernate在主表查询完成后,hibernate对象的session就被关闭了,也就相当于JDBC中的Connection被干掉了,没有connection(Hibernate为Session对象)的查询是非法操作,同样的这里也将报异常信息。那么,我们要怎么进行处理呢?如果想要查询子表对象,就要在作one-to-many的设置时将属性fetch设置为join值,这时,只要查询时就去抓取子对象,这也是hibernate的一种抓取策略。
3.如果lazy="true"并且fetch="join"时,用QBC进行分页查询,会带来新的问题,fetch="join"是采用左外连接查询的,所以主表的数据就会出现很多重复记录,这时需在QBC条件对象加上一个去重的限制,具体代码为:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
也就是说fetch是为子对象服务的,不适合主对象的查询操作.
4. 对于第3点的描述,如果用HQL查询则一切正常,不用加去重操作,子对象也可以查询出来.
5. 如果lazy="false"时,没有设置fetch属性,那么在进行HQL查询时也会抛出sessin 被关闭的异常,所以需要在HQL写上抓取子对象的关键字,例如:from main join fetch main.detail as detail,程序员如果做了该操作,在获取子对象属性时就能采取抓取策略.
6. 在使用DetachedCriteria拼凑查询条件的时候,如何条件涉及到子对象的属性时,需要用DetachedCriteria.createAlias("b","b")来建立映射关系,否则将报出 could not resolve property 的Hibernate查询异常
eg:实体A中包含set<B>
那么在DetachedCriteria 中拼凑查询条件时,如果条件是B中的某个属性Bp1的话,那么应该通过createAlias()创建 实体A于B的关联,例:criteria.createAlias("B", "B"),那么你在添加B的查询条件的时候,add(Restrictions.eq("B.Bp1","test"));
时才不会报错,不然会报找不到属性B.Bp1,当然在设置了关联之后还会引发一个问题也就是上面提到的重复问题,因为设置关联之后hibernate是使用左外连接拼接的sql,这里的解决方案就是也需要加上上面提到的去除重复数据的代码即可.
当然添加实体之间的关联之后,会把B也加载出来,就算设置了延迟加载也没用。