`
alwaysnew
  • 浏览: 28094 次
  • 性别: Icon_minigender_1
  • 来自: 肇庆
社区版块
存档分类
最新评论

hibernate hbm.xml里面使用list标签,查询结果集里面含null记录

阅读更多
主要问题:hibernate中集合映射list中的list-index中的问题:
参见一个配置文件:
<class name="User" table="l_user">
<id column="id" name="id"/>
    <property name="name" column="username" />
<list name="userInfoList" inverse="true" cascade="all" lazy="false">
<key column="userid" not-null="true"/>
<list-index column="userinfoid" />
<one-to-many class="UserInfo" />
</list>
</class>

<class name="UserInfo" table="l_userinfo">
<id name="userinfoid" column="userinfoid" />
<property name="infoType" column="infotype" />
<property name="startDate" column="startdate" type="timestamp" />
<property name="endDate" column="enddate" type="timestamp" />
<many-to-one name="includeUser" column="userid" class="User"/>
</class>
在User类的配置文件中配置了一个List是指定他向UserInfo的关联。其中有key,这是指定UserInfo类对应的table中的关联User类对应的表的外键。使用的是userId;然后就是List-index这个是有序的集合需要配置的内容。我们在这里给他配置的是userinfoid就是UserInfo对应的表的主键。但是这里面是存在一个问题的:list-index在我们取得User对象然后拿到与他关联的UserInfo的List的时候发挥一个非常重要的作用。List-index会要求从0开始,然后自增上去。如果一个User有100个与他关联的UserInfo对象。假设这些UserInfo的id分别是从0-99则没有问题。他会取到这100个关联对象。如果这些UserInfo的Id是从0-50 100-149,那就会有问题了,我们通过User访问UserInfoLIst的时候hibernate会自动发出sql语句拿到与他关联的UserInfo对象。但是他拿到的会是一个大小为150的UserInfoLIst,但是这个list中并不是每一个都是一个完整的UserInfo对象。另外多余的UserInfo对象在这个list里面都是null。这样就会导致一个很严重的问题,如果我们的UserInfo有一个Id是10000,那么他返回的List就是一个大小为10000的list。只是里面有很多空对象。而且我们在遍历访问其中的对象的时候也会做很多没有用的工作。所以我们有必要另外再建立一个属性,作为list映射的List-index使用。但是我们还非常有必要去维护他的值,而且保证他是连续的。如果这样的话那么这种使用外键维护双向的一对多的关系是一个很不可取的方式。或者我们可以直接把他换成set。
转载:http://buzuibuxiu.iteye.com/blog/1028063

分享到:
评论

相关推荐

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    ssh(structs,spring,hibernate)框架中的上传下载

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     17.1.10 按主键逐个处理查询结果(iterate()方法)  17.1.11 可滚动的结果集  17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试

    } } &lt;br&gt; &lt;br&gt;5.Event.hbm.xml 文件 &lt;br&gt;&lt;?xml version="1.0"?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     17.1.10 按主键逐个处理查询结果(iterate()方法)  17.1.11 可滚动的结果集  17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中...

    jdbc基础和参考

    如果有结果集,处理结果集 ResultSet next(),每执行一次,向下移动一次,如果有值,返回true,如果没值返回false while(rs.next()){ rs.getType(index/columnName); 如果传的是index,那么索引是从1开始的。 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     17.1.10 按主键逐个处理查询结果(iterate()方法)  17.1.11 可滚动的结果集  17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     17.1.10 按主键逐个处理查询结果(iterate()方法)  17.1.11 可滚动的结果集  17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中...

    JdbcTemplateTool.zip

    比如你没法像hibernate那样直接传一个对象给它让他拆分成sql并保存起来,当然这也是可以理解的,毕竟它并没有要求你去写 hbm.xml 文件所以无法知道你哪些字段要映射,哪些不要等等。又比如JdbcTemplate 可以帮忙把一...

Global site tag (gtag.js) - Google Analytics