您所在的位置:主页 > Java培训 >

有序Set映射实现接口,具有排序功能

时间:2014-04-19 09:38来源:未知 作者:疯狂java 点击:

有序Set映射

在一个论坛中,有很多帖子,而且每个帖子又有很多跟贴,假如将这些跟帖放入刀集合中,众所周知,这些跟帖有向后顺序,映射这种类型的集合,就需要映射有序的Set。在集合中排序的方法有两种,分别是排序集合和有序集合。其中Set集合两种都支持;Set集合支持排序集合,因为TreeSet类实现了SortedSet接口,具有排序功能。

1.排序集合
排序集合也常称为内存排序,正如其名,指用一个java比较器在内存中进行排序。TreeSet类有两种排序方式,所以在内存排序中也有两种方式,分别为自然排序和客户排序。
(1)自然排序是指按照数字大少排序,或者字符串按Unicode值排序等。要实现自然排序很简单,只需在映射文件Album.hbm.xml中,对<set>元素指定sort="natural",告诉Hibernate使用自然排序方式排序对象,如下所示:
<ste name="images" table="image" lazy="true" sort="natural">
<key><colum name="add" not-null="true" /></key>
<element type="string" colum="name" not-null="true"/>
</set>
此时,Hibernate中集合对象所表示的实体为org.hibernate.collection.PersistentSorted,也即Hibernate在加载照片集合是,使用org.hibernate.collection.PersistentSortedSet来实现java.util.SortedSet集合。在持久化类Album中,需要使用TreeSet来实现Set集合,TreeSet实现了SortedSet接口,并保持集合中对象的顺序。在持久化类Album中把下面的代码:
private Set image=new HashSet(0);
更改为:
private Set image=new TreeSet();
也即使用TreeSet代替HashSet实现Set接口。如果不这样设置,则会抛出如下异常:
java.lang.ClassCastException:java.util.HashSet
at org.hibernate.type.SortedSetType.wrap(SortedSetType.java:49)
这是因为Session对象在保持AIbum对象时,会调用org.hibernate.type.SortedSetType类得wrap()方法,将保存有照片的Set集合实例包装为PersistentSortedSet类的实例。HashSet并不保持对象的顺序,所以把Set包装为有顺序的PersistentSortedSet类的实例,会出现转型错误。(2)客户化顺序。自然排序很显然不能满足排序需求,所以Hibernate允许在<set>元素中通过sort属性指定自定义的排序类,该类需实现java.util.Comparator接口。这是一个实现了Comparator接口的ReverseAll类。该类重写了compare()方法,对集合中的字符串进行降序排序,与自然排序正好相反。更改映射文件Album.hbm.xml,如下所示,只需把sort属性的值更改为指定的类即可。
<set name="images" table="image" lazy="true" sort="album.ReverseAll">
<key><column name="aid" not-null="true"/></key>
<element type="string" column"name" not-null="true"/>
</set>
使用自定义排序,可以实现各种不同的排序方式,不过需要自己指定排序类。使用自然排序简单、方便、只需要<set>元素的属性sort为natural。