zoukankan      html  css  js  c++  java
  • 关联关系介绍

    下面就针对这个问题分为三个方面
    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" />
     
    对应的注解为
     
    1. @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascaType.MERGE,CascaType.REFRESH})  
    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>
     
    对应注解
     
    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表示子对象和父对象的生命周期完全是一样的,完全是由父对象来控制的,所以这样才最贴近需求。

  • 相关阅读:
    第一节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表
    Tensorflow 错误:Unknown command line flag 'f'
    Python 多线程总结
    Git 强制拉取覆盖本地所有文件
    Hive常用函数 傻瓜学习笔记 附完整示例
    Linux 删除指定大小(范围)的文件
    Python 操作 HBase —— Trift Trift2 Happybase 安装使用
    梯度消失 梯度爆炸 梯度偏置 梯度饱和 梯度死亡 文献收藏
    Embedding 文献收藏
    深度学习在CTR预估中的应用 文献收藏
  • 原文地址:https://www.cnblogs.com/zsping/p/5832066.html
Copyright © 2011-2022 走看看