用一个比较玩赖的办法,你把User类中的private Branch branch;
改称private Integer branchId,你看行不,执行效率也提高了。我想有的时候不用一定要准奏Hibernate的规则或思想。

解决方案 »

  1.   

    Branch b = session.load(Branch.class,id);
    user.setBranch(b);就是这样, 不会多出一个查询,因为 load是惰性载入
      

  2.   

    惰性载入?什么意思,可以解释一下吗?在load的时候不是从数据库中检索出这个对象吗?这样不是会多出一条查语句吗?
      

  3.   

    惰性载入(lazyloading) , 是hibernate精华。
    举例子吧Branch b = session.load(Branch.class,id);
    执行这条的时候, 不会马上产生 select * from branch where id=?
    因为这个时候还不需要branch的数据.
    如果你下面执行
    b.getName();
    那么这时候才产生select语句, 因为这个时候才真正需要数据.Branch b = session.load(Branch.class,id);
    user.setBranch(b);
    这两条语句没有用到 b里面的任何数据, 当然就不会生成 select 语句了hibernate懒惰,不就正如你所愿吗
      

  4.   

    load对象,set对象,很规范的代码
      

  5.   

    这个问题都由hibernate帮你处理好了,你只要在user.hbm.xml及Branch.hbm.xml文件中将两个对应的一对多,多对一的关系指定好后,调用HibernateTemplete.save();方法即可以完成存诸操作!
      

  6.   

    djpsunday()说的是对的,设置<one-to-many class="package+classname">,在执行getHibernateTemplate().save()/getHibernateTemplate().saveOrUpdate()时,Hibernate会自己解决这个问题!
      

  7.   

    你的做法是正确的,使用延迟加载会让效率提升.减少多余的sql语句发生,只有你访问数据时才执行sql语句加栽内容
      

  8.   

    延迟加载的负面作用是当你想加载的时候已经把session close掉了,就会出错。所以采用open session in view模式,或者预先加载。
      

  9.   

    我觉得双向的多对一是不错的先把。就像djpsunday所说的。
      

  10.   

    要效率,又要结构,用lazy,如果还有spring和struts,就用opensessioninview
      

  11.   

    配置好两个hbm.xml,实现双向多对一关系,只要保存"多方"就可以了,别的不要搞