`
mickey_hou
  • 浏览: 238356 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

project

阅读更多
单向关联   :当使用单向关联时,由父类管理关联关系,子类无法管理,而这时,父亲知道自己 的儿子,但是,从儿子对象不知道父亲是谁。单向关联时,只指定<one-to-many>
<set name="usageinfos" inverse="true"  cascade="none">
            <key>
                <column name="cloudUser_id" not-null="false" />
            </key>
            <one-to-many class="com.huawei.cloud.permanence.model.Usageinfo" />
</set> 
双向关联:关联关系的管理可以通过inverse指定,这时,儿子能清楚的知道自己的父亲是谁。 双向关联时,还要指定<many-to-one>
<many-to-one name="clouduser"  cascade="none" class="com.huawei.cloud.permanence.model.Clouduser" fetch="join">
            <column name="cloudUser_id" not-null="true" />
</many-to-one>

Cascade属性:控制进行级联操作  all : 所有情况下均进行关联操作。
                                               none:所有情况下均不进行关联操作。这是默认值。
                                               save-update:在执行save/update/saveOrUpdate时进行关联操作。
                                               delete:在执行delete时进行关联操作

inverse:属性,运用于双向关联
    FatherDao fatherDao = new FatherDao(); 
    Father father = new Father("David"); 
    Child child1 = new Child("David Junior One"); 
    Child child2 = new Child("David Junior Two"); 
    father.add(child1); 
    father.add(child2); 
    fatherDao.save(father); 
1. 如果cascade="all"且inverse="false"时:
    Hibernate: insert into father (name) values (?)       
    // cascade = 'all',所以进行级联操作 
    Hibernate: insert into child (name, fatherid) values (?, ?) 
    Hibernate: insert into child (name, fatherid) values (?, ?)       
    // inverse = 'false',由father来维护关系(可以看到这些操作是多余的) 
    Hibernate: update child set fatherid =? where ID=? 
    Hibernate: update child set fatherid =? where ID=?
2. 如果cascade = "none" 且 inverse = "false":
    Hibernate: insert into father (name) values (?)       
    // inverse='false',所以更新关系 
    Hibernate: update child set fatherid =? where ID=?       
    // 但由于cascade='none',child并未插入数据库,导致如下exception 
    org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance    
3. 如果cascade = "all" 且 inverse = "true"
    Hibernate: insert into father (name) values (?)      
    // cascade='all',执行对child的插入 
    Hibernate: insert into child (name, fatherid) values (?, ?) 
    Hibernate: insert into child (name, fatherid) values (?, ?)       
    // 但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新关系。 
4. 如果cascade = "none" 且 inverse = "true"
    Hibernate: insert into father (name) values (?)       
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics