hibernate的集合映射的一些属性

1. 集合映射

  1. 集合属性

属性说明默认值
name映射类属性的名字
accessHibernate访问这个属性的策略 默认值为property
table关联的目标数据库表
chema目标数据库表的schema名字
catalog目标数据库表的catalog名字
lazy是否采用延迟加载
subselect定义一个子查询
sort设置排序的类型 默认值为 unsorted不排序 可选值为 natural自然排序、comparatorClass实现接口类作为排序算法 避免与order-by同时使用
inverse用于标识双向关联中被动的一方 默认值为false
mutable标识被关联对象是否可以改变 默认值为true
cascade设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行更新操作时级联、delete执行删除操作时级联、all-delete-orphan被关联对象失去宿主时将其删除
order-by设置排序规则
where增加筛选条件
fetch设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取
atch-size延迟加载时,一次读取数据的数量 默认值为1

2. 通用属性

  1. name指定要映射的set集合的属性
  2. table集合属性要映射的表
  3. key指定集合表的外键字段
  4. element指定集合表的其他字段
  5. type元素类型,一定要指定

    1. set常用属性

    1. List集合属性的映射
  6. list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的

    1. Map映射
  7. map-key指定map的key

    1. bag跟set一样
  8. 可以映射类型为java.util.Collection接口的属性。

  9. 它的元素可重复,但不保存顺序,不需要额外的索引支持

    1. 其他
  10. inverse 默认是false 即自己维持关联,自己是主控方

  11. lazy
    1. true是查询关联对象的时候使用延迟检索
    2. false 是查询关联对象的时候不使用延迟检索
    3. extra翻译是极其懒惰的,true已经是懒惰的,lazy等于true是不用的时候不传,我用你的时候你再传,extra更懒,比lazy等于true还要懒。
  12. fetch SQL语句查询方法(内连接,子查询)
    1. join:发送迫切左外连接的SQL查询关联对象
    2. select它就会分几次发送多条sql去查询你的关联对象,而join一条sql就搞定了
    3. subselect:发送子查询查询关联对象,使用subselect的时候需要使用query接口进行测试,不能使用get方法来进行测试,因为get看不到效果
  13. cascade 级联操作

    1. 示例代码
    public class CollectionTest {
       private Integer id;
       private String name;
       private List<Integer> lists;
       private Set<String> sets;
       private Map<String, String> postcode;
       private Collection collection;
    
       public Collection getCollection() {
           return collection;
       }
    
       public void setCollection(Collection collection) {
           this.collection = collection;
       }
    
       public Integer getId() {
           return id;
       }
    
       public void setId(Integer id) {
           this.id = id;
       }
    
       public String getName() {
           return name;
       }
    
       public void setName(String name) {
           this.name = name;
       }
    
       public List<Integer> getLists() {
           return lists;
       }
    
       public void setLists(List<Integer> lists) {
           this.lists = lists;
       }
    
       public Set<String> getSets() {
           return sets;
       }
    
       public void setSets(Set<String> sets) {
           this.sets = sets;
       }
    
       public Map<String, String> getPostcode() {
           return postcode;
       }
    
       public void setPostcode(Map<String, String> postcode) {
           this.postcode = postcode;
       }
    }
    
    1. hbm映射
    <?xml version="1.0" encoding="utf-8"?>  
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    
    <hibernate-mapping>   
    
        <class name="CollectionTest" table="TB_COLLECTION">
           <id name="id" column="ID" length="4">
               <generator class="native"/>
           </id>
           <property name="name" column="NAME" length="20"/>
           <set name="sets" table="TB_ADDRESS">
               <key column="CID"/>
               <element column="ADDRESS" type="java.lang.String"/>
           </set>
           <list name="lists" table="TB_PHONE">
               <key column="CID"></key>
               <list-index column="idx"/>
               <element column="PHONE" type="java.lang.Integer"/>
           </list>
           <map name="postcode" table="TB_POST">
               <key column="CID"/>
               <map-key type="string" column="SHORT_NAME"/>
               <element type="string" column="ADDRESS"/>
           </map>
           <!--Bag类型映射-->  
           <bag name="bagValue" table="message">  
              <key column="id" />     //定义外键  
              <element type="string" column="bagValue" />  //定义元素类型  
          </bag>  
       </class>  
    </hibernate-mapping>

使用问题集合

  1. composite-element对应的实例类equal和hashcode方法

    composite-element对应的实体类,必须重写equal和hashcode方法,不然作为set元素存储时会每次都会当做一个新的对象,导致每次get时都会对集合表先执行一次delete操作,然后再执行insert操作。

  2. list/array base的使用

    list/array的起始下标是0,这个需要注意,若集合表中的Index的起始位置不是0,则会导致list/array中有NULL元素的问题,这个时候我们可以使用base来同步集合表中Index的下标,或者集合表中Index的下标记得从0开始。

  3. 与关系映射的一点点区别

    使用集合映射的时候,我们发现和关系映射中使用set/list等属性是差不多的,关系映射中单向一对多的情况,和集合映射是一样的,唯一的区别就是使用集合映射时集合表是不需要配置文件的,但是关系映射时这个多的一方必须有配置文件,这个可能是和单向一对多关系映射中最大的区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值