您的位置:首页 > 其它

Hibernate中实现Set集合的排序

2018-02-27 23:03 399 查看
问题起源:http://blog.csdn.net/akmissxt/article/details/79393251

Hibernate的一对多、多对一和多对多关系中,使用Set集合储存数据,所以可能存在多次查询得到的数据顺序不一致。

以博客系统为例,用户类User中有专栏类Category的Set集合(隐去其他无关属性):public class User {

private Set<Category> categories = new HashSet<Category>();
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}

}
登录成功后,服务器会将登录用户的信息设置到session会话中:session.setAttribute("loginUser", db_user);

然后登录成功后页面通过for each标签遍历session会话中的loginUser显示该用户categories集合中的内容:<!-- 获取专栏以及专栏下的文章 -->
<div id="categories" class="easyui-tree" border=false >
<c:forEach var="cate" items="${loginUser.categories }">
<b><p style="font-size:150%">${cate.title }</p></b>
<c:forEach var="arti" items="${cate.articles }">
<p>${arti.title }</p>
</c:forEach>
</c:forEach>
</div>
但是同一用户多次登陆,会发现显示的专栏名顺序不一致(无序):



对此,可以在设置登录信息之前对loginUser的Set集合进行排序解决问题:                                //将categories集合有序化
Set<Category> categories = db_user.getCategories();
TreeSet ts = new TreeSet(categories);
//将有序的Set集合赋值给categories
db_user.setCategories(ts);
//登陆成功,设置登录信息
session.setAttribute("loginUser", db_user);还需要在Category中实现Comparable接口: @Override
public int compareTo(Category o) {
return (int)(this.cate_id-o.cate_id);
}
因为有序化操作在控制层进行,对对象操作不会影响数据库数据,categories仍然以HashSet存取数据,对整体性能影响不大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hibernate Set