现象:
    我用Hibernate作数据库持久层,我现在有一张用户表tbuser,有10几个字段,包括用户名(name)和一些其它详细信息,在数据库中有很多表关联到这个表user,在访问其它表的数据时,比如日志表tblog,我查看日志时,我要求查看日志操作用户的名字(关联在tbuser.name).
public class Tbuser implements java.io.Serializable { // Fields private Integer userId;
private String userLogin;
private String userPwd;
private String userName;
//more....
}
public class Tblog implements java.io.Serializable { // Fields private Integer logId;
private Tbuser tbuser;
//....more
}问题:
    我用Hibernate访问日志的操作用户时:
Tblog log = new Tblog();
//.....装载一个log
String = log.tbuser.userName;//问题在这一行
Hibernate将查询Tbuser中全部字段(不是全部记录),但实际我只要userName相关的字段就可以了,所以我觉得有点浪费空间!求解:
    像我上面的做法真的影响大吗?如果影响大有什么好的解决方法?

解决方案 »

  1.   

    数据量大时效率会低,那就设置延迟加载,在你的Log.hbm.xml文件中 User属性设置lazy="true".比如你现在的需求,你可以创建用户表和日志的视图,对视图进行操作。
      

  2.   

    或者写HQL语句时候 使用连接表的操作,把用到的字段写到语句中区。从楼主情况看,所有的lazy="false"吧?假如关联的表十分多的话,并且数据量很大的时候效率很很低。
      

  3.   

    如果记录的确是多,
    那种情况直接SQL   彻底防止了N+1次查询问题
      

  4.   

    还有一种解决方法,OpenSessionInViewFilter
    要延迟加载只要把lazy设置成lazy=true就可以了,但是这样设置会出现session is closed异常,所以需要你配置OpenSessionInViewFilter过滤器,配置方法:在web.xml中加上<filter>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <filter-class>
       org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
      </filter-class>
      <init-param>
       <param-name>singleSession</param-name>
       <param-value>true</param-value>
      </init-param>
     </filter>
     <filter-mapping>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>
      

  5.   

    使用延迟加载 
    还有就是 既然使用hibenrate 那么
    “将查询Tbuser中全部字段(不是全部记录),但实际我只要userName相关的字段就可以了”好像避免不了的,应为hibernate 一加载 都是加载全部属性(除非自己在另设查询,只查询单一属性,记得好像有这个方法)。还有一个方法
    private Integer logId;
        private Tbuser tbuser;
    private String username;//冗余一个字段 然后查询时候,而外关联一个一下user表,但是觉得偏离了hibernate