SpringDataJpa备忘录
- 单向多对一关系
//产品类型 一的一方
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
}
//产品,多方
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
//一方的对象
@ManyToOne //默认配置的ManyToOne 会自定键为外键,外键的名称=属性名_id
//多个产品Product对应一个产品类型dir
// 不能使用@Column(name = "dir_id")
@JoinColumn(name = "dir_id")
private ProductDir dir;
}
junit
@Test
public void testSaveProduct() {
Product product = new Product();
product.setName("牛逼");
productService.save(product);
System.out.println("保存成功->"+product);
Product product2 = new Product();
product2.setName("牛逼2");
product2.setDir(new ProductDir());
try {
productService.save(product2);
}catch (Exception e){
System.out.println("该操作会报错->因为一的那方没有id,即缺少外键关系");
}
Product product3 = new Product();
product3.setName("牛逼2");
ProductDir productDir = new ProductDir();
productDir.setName("牛逼的类型");
productDirService.save(productDir);
product3.setDir(productDir);//此时的产品类型有了id
productService.save(product3);
System.out.println("保存成功->"+product3);
System.out.println("保存成功->"+productDir);
}
![]()
@ManyToOne(fetch = FetchType.EAGER) 默认抓取策略,及时加载,一条sql语句
@OneToMany(fetch = FetchType.LAZY) 延时加载,多条sql语句(多的一方默认延时加载)
- 单向一对多关系
//产品,多方
@Entity
public class Product2 {
@Id
@GeneratedValue
private Long id;
private String name;
}
//产品类型 一的一方
@Entity
public class ProductDir2 {
@Id
@GeneratedValue
private Long id;
private String name;
//单向一对多
@OneToMany
//必须配置外键id,否则会多生成一张表吗,形成多对多的关系
@JoinColumn(name = "dir_id")//建议在一的一方实例化集合
//(便于后面保存操作)
private Set products = new HashSet<>();
}
junit
@Test
public void testSaveProduct2() {
Product2 product11 = new Product2();
product11.setName("产品11");
Product2 product22 = new Product2();
product22.setName("产品22");
ProductDir2 productDir2 = new ProductDir2();
productDir2.setName("牛逼2");
productDir2.getProducts().add(product11);
productDir2.getProducts().add(product22);
product2Service.save(product11);//保存后得到主键
product2Service.save(product22);//即获得外键关系
productDir2Service.save(productDir2);
System.out.println("保存成功->"+productDir2);
System.out.println("保存成功->"+product11);
System.out.println("保存成功->"+product22);
}
排序
//单向一对多
@OneToMany
//必须配置外键id,否则会多生成一张表吗,形成多对多的关系
@JoinColumn(name = "dir_id")//建议在一的一方实例化集合(便于后面保存操作)
@OrderBy("id")//默认属性值,不写即升序,
//@OrderBy("id DESC")
private Set products = new HashSet<>();
- 双向一对多关系
//产品,多方
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dir_id")
private ProductDir dir;
}
//产品类型 一的一方
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY,mappedBy = "dir")
//双向一对多,不配置@JoinColumn,配置新的属性mappedBy = "dir"
//表示一方的关系参照多方Product属性dir来管理
private Set products = new HashSet<>();
}
SpringDataJpa备忘录的更多相关文章
- MementoPattern(备忘录模式)
/** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
- Vuex2.0+Vue2.0构建备忘录应用实践
一.介绍Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,适合于构建中大型单页应用. ...
- 设计模式03备忘录(java)
先贴代码有空来写内容. 备忘录1 //简单的备忘录,只可以记录上一次修改前的状态,实现撤回一次的操作. class Student{ private String name; private Stri ...
- C#设计模式系列:备忘录模式(Memento)
1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...
- php实现设计模式之 备忘录模式
<?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...
- 十一个行为模式之备忘录模式(Memento Pattern)
定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...
- 自适应备忘录 demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
随机推荐
- 使用Oracle的PROFILE对用户资源限制和密码限制
转至:https://blog.csdn.net/zhuomingwang/article/details/6444240?utm_medium=distribute.pc_relevant.none ...
- Qt:Shadow Build
每个编辑器有Build和Run两个设置界面. 在Build界面上,有一个"Shadow build"复选框.如果勾选此项,编译后将在项目的同级目录下建立一个编译后的文件目录,目录名 ...
- VSCode 安装Vue 插件 - vetur
想要编辑器识别vue文件需要安装vue插件,在VSCode上好用的是vetur 如下图:(如果没有安装就会出现安装按钮,点击进行安装) 安装完成之后,重启VSCode,就能识别vue文件了,方便我们编 ...
- gcc与g++区别;编译选项
gcc与g++区别:可以相互编译,但是gcc不会自动进行c++的链接 gcc g++编译选项: -E 预处理 -S 编译指定源文件但是不尽兴汇编 -c 编译汇编,但是不进行链接 -o 编译成可执行文件 ...
- JZ-048-不用加减乘除做加法
不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目链接: 不用加减乘除做加法 代码 /** * 标题:不用加减乘除做加法 * 题目描述 ...
- 昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者
摘要:本文带大家快速浏览昇思MindSpore全场景AI框架1.6版本的关键特性. 全新的昇思MindSpore全场景AI框架1.6版本已发布,此版本中昇思MindSpore全场景AI框架易用性不断改 ...
- 『现学现忘』Docker基础 — 11、Docker安装的问题补充
目录 1.问题复现 2.解决冲突 3.重新安装docker-ce-selinux 4.安装Docker-ce 5.总结 通过yum安装Docker的时候,安装20版本的Docker没有出现问题,在安装 ...
- CentOS7.5环境下Docker环境搭建
1. 安装wget工具: yum install wget -y 2. 使用wget工具从docker官网下载yum源: wget -P /etc/yum.repos.d/ https://downl ...
- 创世区块配置文件genesis.json的格式解读
创世区块配置文件genesis.json的格式解读 中文网站上关于genesis 的解析大多数都来自于这个Gist:Ethereum private network configuration gui ...
- Flash XSS
示例: 创建一个测试flash,代码如下,导出swf文件 //取m参数 var m=_root.m; //取showInfo参数 var showInfo=_root.showInfo; //调用ht ...