Hibernate集合映射
Hibernate集合映射主要有以下几种:
- set:对应的POJO属性类型为Set,使用HashSet进行初始化。不保存元素的顺序,并且不允许重复元素。set也可以映射SortedSet,且sort属性可以设置成比较器或者用于内存排列的自然顺序。使用TreeSet进行初始化。
<set name=”” order-by=”” inverse=”” lazy=”” cascade=””> <key column=””/> <one-to-many class=””/> </set> |
- list:对应的POJO属性类型为List,使用ArrayList进行初始化。在集合表(子表)中需要一个额外的索引列保存每个元素在List中的位置。索引可以配置从其它数值开始(默认从0开始<list-index base=”1”…/>),且数据库索引字段必须是连续的,否则hibernate会将null值加入集合中。
<list name=”” inverse=”” lazy=”” cascade=””> <key-index column=””/> <one-to-many class=””/> </list> |
- bag/idbag:对应的POJO属性类型为Collection(也可以是List但不提倡),使用ArrayLis进行初始化。
<bag name=”” inverse=”” lazy=”” cascade=”” order-by=””> <key column=””/> <one-to-many class=””/> </bag> |
- map:对应的POJO属性类型是Map,保持键值对,使用HashMap进行初始化。也可以映射SortedMap,且sort属性可以设置为比较器或者用于内存排序的自然顺序,使用TreeMap进行初始化。
- array:很少使用。
在上述集合中bag、list是不能被排序的(通过sort属性设置比较器或自然顺序,Collection、List并未实现Comparable接口;list的顺序由索引决定。);set、map可以通过映射成SortedSet或TreeMap(两者都实现了Comparable接口),然后通过sort属性进行排序。但是bag、set、map可以通过order-by属性进行数据库级别的排序,hibernate按照排序后的顺序装入Collection或Set中。set、map仅限于jdk1.4以上版本,这是因为hibernate内部通过LinkedHashSet、LinkedHashMap完成set、map映射,更早的jdk中没有这两个类。
在父子双向管理映射中,我们一般在父表的集合关系映射中(set、bag、list、map)指定inverse=”true”,这显示的告诉Hibernate链接的哪一端不应该与数据库同步。在下面的例子中将把Line端所做的变化持久化到数据库,忽略仅对lines集合所做的变化。
在上面的类图中,如果Header的set集合映射设置inverse=”true”,那么header.getLines().add(line)不会使任何变化持久化,只有正确的设置了line.setHeader(header)之后才会进行持久化。
Inverse=”true”提示Hibernate我们在两个映射文件中(父子类)中映射了同一个外键列两次,而只有另一侧(子类一侧)发生变化时才进行持久化操作。
cascade属性可以设置关系映射中的级联操作,hibernate的可选类型:save-update、delete、delete-orphan、all-delete-orphan等,其中delete-orphan、all-delete-orphan仅对one-to-many关系有效。以上面订单头、订单行为例,从header的lines集合中去除一个Line元素,即表明需要删除Line表中的改行,如果Line表不会被其他实体类引用,那么级联操作最好选择delete-orphan、all-delete-orphan都可以。