@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, fetch = FetchType.EAGER)@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, targetEntity = MCategory.class)
@JoinColumn(name = "category_id")
这是设置,能正常运行,当我getHibernateTemplate().find("select * from Book"); 多这一方的时候,会产生N条数据,应该就是一条数据才对啊,请问该如何设置,才能只出一条SQL语句!

解决方案 »

  1.   

    这是parent和child关系,我from child非要出来N+1条语句吗?那么除了二级缓存能解决,还有什么方式能解决呢?
      

  2.   

    @ManyToOne
    @JoinColumn(name = "category_id") 
      

  3.   

    因为是立即加载,所以呢,会出现很多条语句;
    改成懒加载就好了fetch = FetchType.LAZY
      

  4.   

    没有用过hibernate的注解配置,先顶
      

  5.   

    LAZY固然好用,不用LAZY用EAGER该如何呢 ?
      

  6.   

    ("select * from Book") 
    “应该就是一条数据才对啊”怎么可能,这是啥语句,
      

  7.   

    不是的,N+1问题,我想需要一个Sql语句,在不用LAZY属性情况下的,只执行一次,听说eager-fetch可以,但是不知道如何操作,哪位请指点迷津
      

  8.   

    * N + 1问题,在默认情况下,使用query.iterate查询,有可能出现N+1问题
      所谓的N+1是在查询的时候发出了N+1条sql语句
      1: 首先发出一条查询对象id列表的sql
      N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
    * list和iterate的区别?
    * list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
    * iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
      

  9.   

    batch-size属性,可以批量加载实体类,参见:Classes.hbm.xml
    <class name="Classes" table="t_classes" batch-size="3">如果有10+1条语句 就吧batch-size="3"的值设为10   就可以了
    祝你 成功