现象:
我用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相关的字段就可以了,所以我觉得有点浪费空间!求解:
像我上面的做法真的影响大吗?如果影响大有什么好的解决方法?
我用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相关的字段就可以了,所以我觉得有点浪费空间!求解:
像我上面的做法真的影响大吗?如果影响大有什么好的解决方法?
那种情况直接SQL 彻底防止了N+1次查询问题
要延迟加载只要把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>
还有就是 既然使用hibenrate 那么
“将查询Tbuser中全部字段(不是全部记录),但实际我只要userName相关的字段就可以了”好像避免不了的,应为hibernate 一加载 都是加载全部属性(除非自己在另设查询,只查询单一属性,记得好像有这个方法)。还有一个方法
private Integer logId;
private Tbuser tbuser;
private String username;//冗余一个字段 然后查询时候,而外关联一个一下user表,但是觉得偏离了hibernate