1. 单向多对一关系
//产品类型 一的一方
@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语句(多的一方默认延时加载)
  1. 单向一对多关系
//产品,多方
@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<>();
  1. 双向一对多关系
//产品,多方
@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备忘录的更多相关文章

  1. MementoPattern(备忘录模式)

    /** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...

  2. C#设计模式-备忘录模式

    访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...

  3. Vuex2.0+Vue2.0构建备忘录应用实践

    一.介绍Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,适合于构建中大型单页应用. ...

  4. 设计模式03备忘录(java)

    先贴代码有空来写内容. 备忘录1 //简单的备忘录,只可以记录上一次修改前的状态,实现撤回一次的操作. class Student{ private String name; private Stri ...

  5. C#设计模式系列:备忘录模式(Memento)

    1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...

  6. php实现设计模式之 备忘录模式

    <?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...

  7. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...

  8. 自适应备忘录 demo

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. java设计模式之备忘录模式

    备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...

随机推荐

  1. 【C# 基础概念】Unicode编码详解

    Unicode定义:Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字 ...

  2. Nested Class(嵌套类)

    在类.结构或接口中定义的类型称为嵌套类型. 例如 public class Container { class Nested { Nested() { } } } 不论外部类型是类.接口还是构造,嵌套 ...

  3. C#特性(属性)Attribute

    先明确一个概念: 元数据..NET中元数据是指程序集中的命名空间.类.方法.属性等信息.这些信息是可以通过Reflection读取出来的. 再来看个例子: #define BUG //#define ...

  4. oj教程--队列

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  5. Qt:QTextStream

    0.说明 QTextStream提供了读写文本文件的接口. QTextStream可以操作QIODevice,  QByteArray 和 QString,调用QTextStream的流操作可以方便的 ...

  6. Pycharm:设置完Anaconda后报错TypeError: an integer is required (got type bytes)

    背景:安装了最新版本的Anaconda3.9后,在Pycharm中设置Python Interpreter为这个最新版本Anaconda文件下的python.exe后,控制台无法启动并报错TypeEr ...

  7. JZ-062-二叉查找树的第 K 个结点

    二叉查找树的第 K 个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 题目链接: 二叉查找树的第 K 个结点 代码 /** * 标题:二叉查找树的第 K 个结点 * 题目描述 * 给定 ...

  8. k8s集群StatefulSets的Pod优雅调度问题思考?

    k8s集群StatefulSets的Pod优雅调度问题思考 考点之你能解释一下为什么k8s的 StatefulSets 需要VolumeClaimTemplate嘛? 考点之简单描述一下Statefu ...

  9. jvm初步理解

    1.什么是运行时数据区? 1.什么是运行时数据区 ​ javac 指令:编译java文件生成class文件 ​ java指令:运行class文件即将数据放到jvm中 ​ class文件运行,后将不同的 ...

  10. 5分钟了解Redis的内部实现快速列表(quicklist)

    快速列表简介 在Redis3 .2版本之前,存储列表(list)数据结构使用的是压缩列表(ziplist)和链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比较小的时候,使用压缩 ...