学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心.

这个是接触后端的一个感受 , Spring boot使用了特定的方式来进行配置 ,大大简化了后端开发人员的开发工作量 ,比如JPA:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来 ,此时数据之间的关系维护和数据结构的制定就显得尤为关键 , 下面记录数据表对应关系中的常见关系:一对多关系.

数据表关系

下面用实际场景简单理解数据表之间的关系

一对一:我有一个身份证号 ;

一对多:我有多张银行卡;

多对多:我是招行、交行、建行的客户,但是这些银行用户均过亿。

一对多双向关联

下面以订单order和订单项orderitem来展示

创建订单实体类,代码如下:

packagelearn.jpa.entity;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.Id;importjavax.persistence.OneToMany;/*** 订单*/@Entity//定义类为实体类

public classOrder {privateString orderid;private float amount =0f;private Set item = new HashSet();

@Id//实体标识符,因为是字符串类型,所有不能用 @GeneratedValue,只能人为的赋值

@Column(length=20)publicString getOrderid() {returnorderid;

}public voidsetOrderid(String orderid) {this.orderid =orderid;

}

@Column(nullable= false)public floatgetAmount() {returnamount;

}public void setAmount(floatamount) {this.amount =amount;

}

@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE})public SetgetItem() {returnitem;

}public void setItem(Setitem) {this.item =item;

}

}/*** 1 - N

* 多的一端为关系维护端,关系维护端负责外键记录的更新

**/

创建订单项实体类,代码如下

packagelearn.jpa.entity;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;/*** 订单项*/@Entity//定义类为实体类

public classOrderItem {private intid;privateString productName;private float sellPrice =0f;privateOrder order;

@Id//实体标识符

@GeneratedValue //主键自动增长

public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}

@Column(length=40,nullable=false)publicString getProductName() {returnproductName;

}public voidsetProductName(String productName) {this.productName =productName;

}

@Column(nullable=false)public floatgetSellPrice() {returnsellPrice;

}public void setSellPrice(floatsellPrice) {this.sellPrice =sellPrice;

}publicOrder getOrder() {returnorder;

}public voidsetOrder(Order order) {this.order =order;

}

}

注解:

1、@OneToMany(fetch=FetchType,cascade=CascadeType)

@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.

fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.

cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

(1)、CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法

(2)、CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据

(3)、CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法

(4)、CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法

CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)

CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化)

CascadeType.REMOVE只有A类删除时,会级联删除B类;

CascadeType.ALL包含所有;

综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错,用CascadeType.ALL时要斟酌下CascadeType.REMOVE

optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true

一对多延迟加载与关系维护

订单实体类,代码:

packagelearn.jpa.entity;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.Id;importjavax.persistence.OneToMany;importjavax.persistence.Table;/*** 订单*/@Entity//定义类为实体类

@Table(name="orders")public classOrder {privateString orderid;private float amount =0f;private Set item = new HashSet();

@Id//实体标识符,因为是字符串类型,所有不能用 @GeneratedValue,只能人为的赋值

@Column(length=20)publicString getOrderid() {returnorderid;

}public voidsetOrderid(String orderid) {this.orderid =orderid;

}

@Column(nullable= false)public floatgetAmount() {returnamount;

}public void setAmount(floatamount) {this.amount =amount;

}/*** 如果是一对多或多对多 fetch 默认是延迟加载,反之是立即加载

* mappedBy="order" 表示由实体 OrderItem 中的 order 属性维护

*@return

*/@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE},

fetch=FetchType.LAZY,mappedBy="order")public SetgetItem() {returnitem;

}public void setItem(Setitem) {this.item =item;

}public voidaddOrderItem(OrderItem orderItem){

orderItem.setOrder(this);this.item.add(orderItem);

}

}/*** 1 - N

* 多的一端为关系维护端,关系维护端负责外键记录的更新

**/

mappedBy只有在双向关联时,才会使用这个属性

mappedBy=”另一方的关系引用属性”

订单项实体类,代码:

packagelearn.jpa.entity;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Table;/*** 订单项*/@Entity//定义类为实体类

public classOrderItem {private intid;privateString productName;private float sellPrice =0f;privateOrder order;

@Id//实体标识符

@GeneratedValue //主键自动增长

public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}

@Column(length=40,nullable=false)publicString getProductName() {returnproductName;

}public voidsetProductName(String productName) {this.productName =productName;

}

@Column(nullable=false)public floatgetSellPrice() {returnsellPrice;

}public void setSellPrice(floatsellPrice) {this.sellPrice =sellPrice;

}

@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},fetch=FetchType.EAGER,optional=false)

@JoinColumn(name="order_id")publicOrder getOrder() {returnorder;

}public voidsetOrder(Order order) {this.order =order;

}

}

joinColumns属性表示,在保存关系中的表中,所保存关联关系的外键的字段。并配合@JoinColumn标记使用。

小结

理解关联表中存储的关系对含义, 记下使用的套路基本上就没什么问题了 ,下篇文章将记录多对多双向关联与级联操作 .

jpa级联添加_JPA中的一对多双向关联与级联操作相关推荐

  1. JPA规范:一对多、一对一、多对多的双向关联与级联操作以及JPA联合主键

    通常在企业开发中,开发Dao层有两种做法:  (1)先建表,后再根据表来编写配置文件和实体bean.使用这种方案的开发人员受到了传统数据库建模的影响.  (2)先编写配置文件和实体bean,然后再生成 ...

  2. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  3. hibernate的一对多双向关联映射----客户和订单关系

    客户和订单关系:客户是一的一方,订单是多的一方. customer表: CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , ...

  4. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  5. hibernate的映射之二(一对多双向关联)

    hibernate的一对多双关联 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 hihernate一对多关联映射(双向Dept<----->Emp) 一对多双 ...

  6. jpa级联添加_jpa级联(Cascade)操作

    由于 重复性的操作十分烦琐,尤其是在处理多个彼此关联对象情况下,此时我们可以使用级联(Cascade)操作.级联 在关联映射中是个重要的概念,指当主动方对象执行操作时,被关联对象(被动方)是否同步执行 ...

  7. jpa 循环引用_JPA中按身份引用

    jpa 循环引用 在上一篇文章中 ,我提到我选择通过其主键而不是类型来引用其他聚合. 在处理大型或复杂域模型时,我通常使用这种方法(也称为断开域模型). 在本文中,让我尝试进一步解释如何在JPA中完成 ...

  8. MyBatis一对多双向关联——MyBatis学习笔记之七

    处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素.例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collect ...

  9. Hibernate5-多对一双向关联-fetch=select,lazy=proxy,在一的一方的class标签中添加

    1.创建项目,项目名称hibernatedemo28,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体类Forum,包名(com.mycompa ...

最新文章

  1. 深入微服务 API 网关之架构实践篇
  2. C++知识点19——使用C++标准库(再谈string——string的初始化、赋值、添加、删除、访问)
  3. python paramiko模块 远程上传目录文件
  4. python多久学会自学-python自学多久
  5. 让你分分钟学会Javascript中的闭包
  6. 芝麻信用_别忘查看支付宝芝麻信用分,这些特权别浪费
  7. 【struts2】struts2工作流程
  8. 求1+2+…+n变态问题的两个很棒的解法
  9. 为什么玩家会流失:如何理解次日留存率
  10. 5岁儿童自学python编程-多大的孩子学python编程比较好
  11. 使用IntelliJ IDEA开发Maven初始化创建流程
  12. 静默安装apk,静默卸载apk
  13. 用ajax请求豆瓣api,结合豆瓣Api v2.0实现Jsonp跨域
  14. 利用Excel制作库房管理系统
  15. 经验分享——家校互动系统功能教程资源
  16. 移动硬盘拒绝访问问题解决方法
  17. arch配置之百度网盘
  18. 微信小程序第三方登录
  19. VUE 表单input 框使用@blur事件
  20. SaaS营销网站剖析:SaaS主页,你给用户的第一印象

热门文章

  1. linux命令mov,汇编指令_Y-linuz-linux-w_新浪博客
  2. LVM的逻辑卷管理及CentOS挂载
  3. 服务器2003系统黑屏怎么办,windows-server-2003 – Windows Server 2003 – 黑屏,光标在启动时...
  4. Arcgis Engine矢量裁剪栅格,调用Mask工具相关代码
  5. 计算机考研需要看数据库吗,05报考华中科技计算机系数据库所的我复试经历
  6. 名片识别信息分类python_python文字识别
  7. sqlrelay mysql_SQLrelay数据库负载均衡
  8. 同时两个版本php,查看“实现多个PHP版本共存和互相切换”的源代码
  9. 计算机网络与传统的通信网络的最大区别,3G,4G技术3G与传统通信技术的主要区别?主要特色?另对4G稍 爱问知识人...
  10. android studio读写txt,Android Studio从.txt文件读取/写入,保存路径?