hibernate 使用list集合映射的一个问题
主要问题:hibernate中集合映射list中的list-index中的问题:
参见一个配置文件:
<classname="User"table="l_user">
<idcolumn="id"name="id"/>
<propertyname="name"column="username"/>
<listname="userInfoList"inverse="true"cascade="all"lazy="false">
<keycolumn="userid"not-null="true"/>
<list-indexcolumn="userinfoid"/>
<one-to-manyclass="UserInfo"/>
</list>
</class>
<classname="UserInfo"table="l_userinfo">
<idname="userinfoid"column="userinfoid"/>
<propertyname="infoType"column="infotype"/>
<propertyname="startDate"column="startdate"type="timestamp"/>
<propertyname="endDate"column="enddate"type="timestamp"/>
<many-to-onename="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-50100-149,那就会有问题了,我们通过User访问UserInfoLIst的时候hibernate会自动发出sql语句拿到与他关联的UserInfo对象。但是他拿到的会是一个大小为150的UserInfoLIst,但是这个list中并不是每一个都是一个完整的UserInfo对象。另外多余的UserInfo对象在这个list里面都是null。这样就会导致一个很严重的问题,如果我们的UserInfo有一个Id是10000,那么他返回的List就是一个大小为10000的list。只是里面有很多空对象。而且我们在遍历访问其中的对象的时候也会做很多没有用的工作。所以我们有必要另外再建立一个属性,作为list映射的List-index使用。但是我们还非常有必要去维护他的值,而且保证他是连续的。如果这样的话那么这种使用外键维护双向的一对多的关系是一个很不可取的方式。或者我们可以直接把他换成set。