关联关系

下面就针对这个问题分为三个方面

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表示子对象和父对象的生命周期完全是一样的,完全是由父对象来控制的,所以这样才最贴近需求。

时间: 2024-10-25 20:34:51

关联关系的相关文章

Hibernate利用关联关系操纵对象

利用关联关系操纵对象 数据对象之间关联关系有一对一.一对多及多对多关联关系.在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难.本节讲解如何在Hibernate中处理这些对象之间的关联关系.本节使用到4个类,它们分别是Student(学生).Card(学生证).Group(班级)和Course(课程),它们之间的关联关系如图1-1所示.这些实体存在级联(cascade)问题.例如,当删除一个班级的信息时,还要删除该班的所有学生的基本信息.如果直接使用JDBC执行这种级联操作,会非常烦琐

Laravel5.1 模型--关联关系(复杂)

关联关系不只是我之前记录的一对一,一对多,多对多这些相对简单的关系,在实际开发中我们会遇到比较复杂的关系. 远程一对多 远程一对多听着比较花哨 举个栗子就很清楚了,比如用户和文章是一对多的关系,国家和用户也是一对多的关系,这样看来 用户是可以作为中间关联对象来为国家和文章间建立一对多的关系,如果还是云里雾里 就直接看代码: 我们创建一个国家表: php artisan make:migration create_countries_table --create=countries public

mybatis学习笔记三(关联关系)

学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.entity; /** * 此类是:学生 * @author hpc * @2017年1月14日下午7:06:33 */ public class Student { private Integer student_id;//学生id private String student_name;//学生名字

hibernate(十)关联关系的CRUD

一.保存 1. 假设一个group有多个user,一个user只属于一个group,当保存user对象到数据库中时可以 User u = new User(); u.setName("u1"); Group g = new Group(); g.setName("g1"); u.setGroup(g); Session s = sessionFactory.getCurrentSession(); s.beginTransaction(); s.save(g);//

10、JPA_映射双向多对多的关联关系

双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对多的关联关系可以拆分成三张表,两个双向多对一关联关系.拆分以后还是有一张中间表,其好处就是可以在中间表中添加某些属性用作其它.这个后面会讲解.而单纯的双向多对多关联关系的中间表有两个外键列,无法增加其它属性. 本节只讲单纯的双向多对多关联关系.从例子讲解配置方法和原理: 有“商品Item”和“类别C

7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

单向一对多的关联关系 关联特点:1的一方有n的一方的集合属性,n的一方却没有1的一方的引用 比如:Customer对Order是一对多的关联关系,则Customer中有Order的集合属性,而Order中却没有对Customer的引用.这样可以通过客户检索到其所有的订单信息,却不能够由订单得到其所属的客户. 映射单向一对多的关联关系有两个要点: 1.利用@OneToMany注解进行单向一对多的映射: 2.利用@JoinColumn来映射外键列的名称: 注意的点: 1.@OneToMany的默认检

6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)

单向多对一的关联关系 具体体现:n的一方有1的引用,1的一方没有n的集合属性 举个例子:订单Order和顾客Customer是一个单向多对一的关联关系.Order是n的一方,有对Customer的引用:而Customer作为1的一方却没有Order的集合属性. 主要是对n的一方使用@ManyToOne和@JoinColumn注解.而1的一方不需要做任何修改.具体的映射方法: 1.采用@ManyToOne注解映射多对一的关联关系,默认情况下采用“左外连接”的方式进行加载.可以通过配置@ManyTo

【原】使用Bmob作为iOS后台开发心得——查询关联关系(BmobRelation)

简介 Bmob中的数据关联分为Pointer和Relation两种(数据关联在我开发app过程中使用还是很频繁的,也算个难点.虽然之前没有学过数据库,但是觉得还是有必要熟悉和掌握它),对此,Bmob官方文档已经介绍得很详细了. 基本上查看文档就可以解决大部分数据关联的问题(Bmob的文档真心要赞一下).这里我记录下当时我最难理解的一个部分——查询关联关系. 还是使用官方文档的事例来学习(这一处官网有些地方的objectId书写错了,记录下时间2015-09-14). Post表(所有用户发表的文

jpa的双向一对多和双向一对一关联关系

在分享之前先给大家看两个异常,应该说这一类的异常还是很常见的,主要原因是jar包冲突 异常1: java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59) at org.hibernate.cfg

Hibernate关联关系的CRUD

本文以Group和User(一对多.多对一)双向关联为例,介绍关联关系的CRUD   下面先介绍两个属性 cascade:只影响CRUD中的CUD,即存储(save).更新(update).删除(delete) fetch:只影响CRUD中的R,即读取(get.load)   cascade(级联): 此属性仅仅帮助我们简化编程,不是必选项 如果A和B为单向关联,则在主导方设置cascade属性 如果A和B为双向关联,则在双方都要设置cascade属性 如果两个对象之间有关联关系,比如User和