• 关联关系


    下面就针对这个问题分为三个方面
    1)一对多双向关联
    2)多对一单向关联
    3)一对多双向自身关联
     
     

    1)一对多双向关联

     
        
        需要注意的是通常情况下,一对多双向关联和多对一双向关联都是同一个意思。因为就从你那个角度来看待这个问题了,这个应该是么有问题滴。
     
        实体配置 
     
    private Set<Score> scores=new HashSet<Score>();
    public void set setScores(Score scores){
    this.scores=scores;
    }
    public Set<Score> getScores(){
    return scores;
    }
    private Student student;
    public void setStudent(Student student){
    this.student=student;
    }
    public Student getStudent(){
    return student;
    }
    <set name="scores" cascade="sava-update">
    <key column="StudentID />
    <one-to-many class="com.jczb.domain" />
    </set>
    <many-to-one name="student" cascade="save-update" />
     
    对应的注解为
     
    [java] view plain copy
     
     print?
    1. @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascaType.MERGE,CascaType.REFRESH})  
    [java] view plain copy
     
     print?
    1. @JoinColumn(name="studentID")  



     
    简单介绍一下上面一些的配置的含义
     
     
        i:set 表示在对应的scores属性为java.util.set类声明的变量
        ii:cascade 表示在属性scores在更新或者保存的时候全部保存或更新持久态student对象 
     
     
     
     
    如上,常见的一对多双向关联所示,大家都知道hibernate是根据缓存中对象关联属性的变化同步更新数据库中的数据,在配置文件中,将inverse属性设置为false时,那么在感受到scores属性变化时会执行两条SQL语句。当scores属性变化,来更新student的持久化状态;当student属性发生变化,来更新scores变化,这时候scores是没有变化的,这时候不会再执行SQL。一共执行了两条SQL语句,而当将scores属性的inverse属性设置为true时就可以来避免重复执行sql语句的情况。这时候是仅仅根据scores属性的变化来更改持久化数据。
     
     
    所以一般情况在one的一段,在本例中就是在student一端将inverse属性设置为true。推荐设置如下
     
     
    <set name="scores" cascade="sava-update" inverse="true">
    <key column="StudentID />
    <one-to-many class="com.jczb.domain" />
    </set>
     
    对应注解
     
    [java] view plain copy
     
     print?
    1. @OneToMany(cascadeType={cascadeType.All},fetch=FetchType.LAZY)  


    2)多对一单向关联

     
     
    其实在理解上面的一对多双向关联之后,再来理解这个多对一单向的关联关系简直是水到渠成。
     
    还是拿这个例子来说明这个关联,多个scores对应一个student。这时候仅仅需要查询出来这个分数属于哪个学生即可,其他需求暂且不考虑。
     
    <many-to-one name="student"
    cascade="save-update"
    class="com.jczb.domain.student"
    not-null="true"
    lazy="false"
     
    />
     
     
     
    还是简单解释一下
     
     
    i:属性为student ,当在内存中感受到student属性值发生变化时,会保存或者更新score对象对应的持久化数据。not-null:表示对应的关系型数据库不能为空,lazy 属性在一般默认为proxy  默认为lazy=proxy, 在获取关联对象时,不进行查询,在获取关联对象的具体实现时,才执行sql查询    lazy=false时,不延时,马上加载
     
     

    3)一对多双向自身关联

     

    这种情况一般出现在树形的组织结构中,例如:organization这个实体,就可能出现父子结构这种关联关系。道理和第一个都是一样的,由此咱们直接看对应的xml文件即可。

    <set name="organizations"
    cascade="all-delete-orphan"
    inverse="true">
    <key column="ParentID" />
    <one-to-many class="com.jczb.domain" />
    </set>
     

    i:将cascade属性设置为all-delete-orphan表示子对象和父对象的生命周期完全是一样的,完全是由父对象来控制的,所以这样才最贴近需求。

     
     
  • 相关阅读:
    BZOJ 1051: [HAOI2006]受欢迎的牛
    BZOJ 3668: [Noi2014]起床困难综合症
    BZOJ 4395: [Usaco2015 dec]Switching on the Lights
    BZOJ 2763: [JLOI2011]飞行路线
    Bzoj 3196 Tyvj 1730 二逼平衡树
    BZOJ 2407: 探险/4398: 福慧双修
    BZOJ 3040: 最短路(road)
    BZOJ 2809: [Apio2012]dispatching
    BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
    BZOJ 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/zhangzhenzhen/p/5831460.html
Copyright © 2020-2023  润新知