本帖最后由 svse08 于 2009-11-16 23:45:09 编辑

解决方案 »

  1.   

    你现在的程序明显保存了两条 Student ,Card 。现在你通过程序
     Query q = s.createQuery("from Student");//获得主对象
                List<Student> list = q.list();
                for(Student stu:list){//编列主对象
                    System.out.println(stu.getCard().getCardNo()); //查询子对象
                }
    明显就是3条sql嘛?这有什么问题呢?
      

  2.   

    from Student查询所有的Student(主)对象就连同Card对象也连带查了出来。之后stu.getCard().getCardNo()不必再进入数据库,而是从缓存中获得的。查询语句也应该只有一条,join方式的。
    如果反过来通过Card查Student的属性才会出现N+1的情况。
      

  3.   

    我晕啦,hibernate默认的家取策略是select .你这里没有指明为join,当然会出现3条啦。
    改成这样:
    Query q = s.createQuery("from Student");
                List<Student> list = q.list();
    改为
    List<Student> list = session.createCriteria(Student.class).setFetchMode("card", FetchMode.JOIN).list();
      

  4.   

    你这样可行,但是我在<one-to-one>标签中加上fetch="join"/>为什么没效果?
     <one-to-one name="card" fetch="join"/>
      

  5.   

    你去看看hibernate的家取策略就晓得啦
      

  6.   

    以下是因为你延迟加载,显示
    Hibernate: select student0_.id as id1_, student0_.name as name1_ from svse.dbo.student student0_
    以下是因为你list中有2条记录,显示
    Hibernate: select card0_.id as id0_0_, card0_.cardNo as cardNo0_0_ from svse.dbo.card card0_ where card0_.id=?
    Hibernate: select card0_.id as id0_0_, card0_.cardNo as cardNo0_0_ from svse.dbo.card card0_ where card0_.id=?