黑马程序员技术交流社区
标题:
Hibernate3属性延迟加载问题
[打印本页]
作者:
许晨峰
时间:
2011-9-27 19:35
标题:
Hibernate3属性延迟加载问题
最近在做一个项目,项目对应的数据里面有一个table为teacher
项目中有一个实体类为Teacher,ORM文件为:Teacher.hbm.xml
实体类Teacher
[code=java]public class _Teacher {
private int tid;
private String tname;
private int tsex;
private int tage;
private Set<_Class> _class;
public _Teacher() {
_class = new HashSet<_Class>();
}
//...省略getter、setter方法
}[/code]
Teacher类的映射文件:
[code=java]//...省略头部信息
<hibernate-mapping package="com.test.model">
<class name="_Teacher" table="_teacher">
<id name="tid" column="tid">
<generator class="native"></generator>
</id>
<property name="tname" type="java.lang.String" lazy="true">
<column name="tname" length="20" not-null="true"></column>
</property>
<property name="tsex" type="java.lang.Integer">
<column name="tsex" not-null="true"></column>
</property>
<property name="tage" type="java.lang.Integer">
<column name="tage" not-null="true"></column>
</property>
<set name="_class" table="_class" cascade="delete">
<key>
<column name="tid"/>
</key>
<one-to-many class="com.test.model._Class"/>
</set>
</class>
</hibernate-mapping>[/code]在映射文件中,我将tname属性的lazy="true"[code=java] String hql = "from _Teacher";
Query q = session.createQuery(hql);
List<_Teacher> lc = q.list();
for(_Teacher t : lc) {
System.out.println("sex:"+t.getTsex());
System.out.println("name:"+t.getTname());
}[/code]输出为:
Hibernate: select teacher0_.tid as tid0_, teacher0_.tname as tname0_, teacher0_.tsex as tsex0_, teacher0_.tage as tage0_ from _teacher teacher0_
sex:0
name:accp
sex:0
name:李思文
Hibernate将所有表中信息加载出来了,而我设置了tname属性延迟加载,照理说在输出t.getTname()的时候session应该执行查询操作啊,但是却没有。这让我百思不得其解。找了半天也没找出问题症结所在。有高人来解释下吗?
[
本帖最后由 许晨峰 于 2011-09-27 19:38 编辑
]
作者:
匿名
时间:
2011-9-28 09:19
hibernate支持对一对多、多对多、一对一以及大对象进行延迟加载。个人觉得在基本数据类型的变量上用lazy=true没有什么意义,反而增加了对数据库访问的次数,消耗了网络带宽,具体的去查下hibernate文档是否对基本类型的变量延迟加载的支持情况。
作者:
匿名
时间:
2011-9-28 11:11
标题:
回复 沙发 的帖子
嗯,谢谢。我模拟的是项目中的一个错,模拟做这么个测试,我项目的原始文件就是这个样子的,加载的这个字段,在数据库中数据类型为ntext的,比较大。在这里只是做了个模拟。在我数据库中这个字段的值大的有三百kb那么大,不设置延迟加载太慢了。
作者:
匿名
时间:
2011-9-28 11:56
我明白你的意思,你是要测试这个属性的作用,但是他支不支持简单属性的延迟我得去看一下doc才能回答,我没有深入研究,据我的经验,一般延迟加载都是对应一个collection或list,这样才有意思,你想一个对象你都得到了,你去延迟他的一个简单属性没意思,一般这个的用途是这样,比如一个班,他有id,name发生,他还关联学生,那学生对象就可以延迟加载了,这样,如果 只想得到这个班的名称就不用去加载学生,只有相得到这个班有多少学生时才去加载学生对象。
支不支持简单属性你去查一下吧,好像3.几以后才支持的吧,我就不去深入研究了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2