`
iceside
  • 浏览: 13754 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate集合映射

阅读更多

 

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:很少使用。

 

    在上述集合中baglist是不能被排序的(通过sort属性设置比较器或自然顺序,CollectionList并未实现Comparable接口;list的顺序由索引决定。);setmap可以通过映射成SortedSetTreeMap(两者都实现了Comparable接口),然后通过sort属性进行排序。但是bagsetmap可以通过order-by属性进行数据库级别的排序,hibernate按照排序后的顺序装入CollectionSet中。setmap仅限于jdk1.4以上版本,这是因为hibernate内部通过LinkedHashSetLinkedHashMap完成setmap映射,更早的jdk中没有这两个类。

在父子双向管理映射中,我们一般在父表的集合关系映射中(setbaglistmap)指定inverse=”true”,这显示的告诉Hibernate链接的哪一端不应该与数据库同步。在下面的例子中将把Line端所做的变化持久化到数据库,忽略仅对lines集合所做的变化。



    在上面的类图中,如果Headerset集合映射设置inverse=”true”,那么header.getLines().add(line)不会使任何变化持久化,只有正确的设置了line.setHeader(header)之后才会进行持久化。

Inverse=”true”提示Hibernate我们在两个映射文件中(父子类)中映射了同一个外键列两次,而只有另一侧(子类一侧)发生变化时才进行持久化操作。

     cascade属性可以设置关系映射中的级联操作,hibernate的可选类型:save-updatedeletedelete-orphanall-delete-orphan等,其中delete-orphanall-delete-orphan仅对one-to-many关系有效。以上面订单头、订单行为例,从headerlines集合中去除一个Line元素,即表明需要删除Line表中的改行,如果Line表不会被其他实体类引用,那么级联操作最好选择delete-orphanall-delete-orphan都可以。

 

  • 大小: 17.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics