coolhwm 2011-11-19 13:50
浏览 235
已采纳

关于基于Hibernate留言板的疑惑,hibernate自动获取关联对象的问题

只有用户,和留言两个表,POJO如下:

 

public class Article {
    private Integer id;
    private String title;
    private String content;
    private User user;
                //省略setter,getter
}
public class User {
    private Integer id;
    private String username;
    private String password;
    private Set<Article> articles = new HashSet<Article>();
}

Article 的XML映射文件

 

<hibernate-mapping package="com.minibbs.domain">
    <class name="Article" table="T_ARTICLE">
        <cache usage="read-only"/>
        <id column="article_id" name="id">
            <generator class="sequence" />
        </id>
        <property name="title" column="title" type="string" length="20" not-null="true"/>
        <property name="content" column="content" type="text" />
        <many-to-one name="user" column="user_id" class="User" not-null="true" lazy="false" />
    </class>
</hibernate-mapping>

进入留言列表,读取所有留言

需要的信息有Article的title和content,以及User的username

 

<s:iterator value="#request.articles" id="a" status="s">
     <tr>
            <td><s:property value="#s.index"/></td>
            <td class="title"><s:property value="#a.title"/></td>
            <td class="content"><s:property value="#a.content"/> </td>
            <td class="username"><s:property value="#a.user.username"/></td>
    </tr>
</s:iterator>

查询语句

 

public List<Article> findAll() {
    return getHibernateTemplate().find("from Article");
}

此时,进入文章列表会产生多条SQL语句

 

 

Hibernate: 
    /* 
from
    Article */ select
        article0_.article_id as article1_0_,
        article0_.title as title0_,
        article0_.content as content0_,
        article0_.user_id as user4_0_ 
    from
        T_ARTICLE article0_
Hibernate: 
    /* load com.minibbs.domain.User */ select
        user0_.user_id as user1_1_0_,
        user0_.username as username1_0_,
        user0_.password as password1_0_ 
    from
        T_USER user0_ 
    where
        user0_.user_id=?
Hibernate: 
    /* load com.minibbs.domain.User */ select
        user0_.user_id as user1_1_0_,
        user0_.username as username1_0_,
        user0_.password as password1_0_ 
    from
        T_USER user0_ 
    where
        user0_.user_id=?
Hibernate: 
    /* load com.minibbs.domain.User */ select
        user0_.user_id as user1_1_0_,
        user0_.username as username1_0_,
        user0_.password as password1_0_ 
    from
        T_USER user0_ 
    where
        user0_.user_id=?
Hibernate: 
    /* load com.minibbs.domain.User */ select
        user0_.user_id as user1_1_0_,
        user0_.username as username1_0_,
        user0_.password as password1_0_ 
    from
        T_USER user0_ 
    where
        user0_.user_id=?

从User表中读取用户对象的SQL语句条数和发帖人的总个数有关一样。

 

请问这样是正常的么?我感觉用户的信息可以在一条SQL语句中同时可以拿出来?有必要么?

 

 

 

  • 写回答

1条回答 默认 最新

  • 爱上一条鱼 2011-11-19 16:47
    关注

    正常的,这是因为你用的配置的fetch是select

    就是关联的时候,hibernate可以配置你可以N+1次查询获取关联对象,或者是直接用join一次连接查询出关联对象。

    默认fetch=select
    [code="java"] [/code]

    你可以改成join 就不会N+1次查询了
    [code="java"] [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料