A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许晨峰 黑马帝   /  2011-9-27 19:35  /  2457 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近在做一个项目,项目对应的数据里面有一个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 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

3 个回复

正序浏览
黑马网友  发表于 2011-9-28 11:56:14
板凳
我明白你的意思,你是要测试这个属性的作用,但是他支不支持简单属性的延迟我得去看一下doc才能回答,我没有深入研究,据我的经验,一般延迟加载都是对应一个collection或list,这样才有意思,你想一个对象你都得到了,你去延迟他的一个简单属性没意思,一般这个的用途是这样,比如一个班,他有id,name发生,他还关联学生,那学生对象就可以延迟加载了,这样,如果 只想得到这个班的名称就不用去加载学生,只有相得到这个班有多少学生时才去加载学生对象。
支不支持简单属性你去查一下吧,好像3.几以后才支持的吧,我就不去深入研究了。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 11:11:38
藤椅

回复 沙发 的帖子

嗯,谢谢。我模拟的是项目中的一个错,模拟做这么个测试,我项目的原始文件就是这个样子的,加载的这个字段,在数据库中数据类型为ntext的,比较大。在这里只是做了个模拟。在我数据库中这个字段的值大的有三百kb那么大,不设置延迟加载太慢了。
回复 使用道具 举报
黑马网友  发表于 2011-9-28 09:19:32
沙发
hibernate支持对一对多、多对多、一对一以及大对象进行延迟加载。个人觉得在基本数据类型的变量上用lazy=true没有什么意义,反而增加了对数据库访问的次数,消耗了网络带宽,具体的去查下hibernate文档是否对基本类型的变量延迟加载的支持情况。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马