JPA3–双向与级联操作

一 、单向一对多

1.1配置

在一方配置onetomany

@Entity
@Table(name="t_productDir")
public class ProductDir {@Id@GeneratedValueprivate Long id;private String name;//配置多方 List/Set@OneToMany(fetch = FetchType.LAZY)@JoinColumn(name="dir_id")@OrderBy("price desc")private List<Product> products = new ArrayList<>();

多方配置:

@Entity
@Table(name="t_product")
public class Product {@Id@GeneratedValueprivate Long id;private String name;
1.2保存操作:

不管是先保存一方还是多方,都有额外发送sql ,效率上面比较低,建议使用单向多对一,如果要学习双向 这个也要学习

1.3在使用集合的时候,使用接口 比如List/Set(掌握)

List主要有顺序上面 比如组合就可以使用
Set主要多对多 多对一上面 没有顺序 但是orderby 也可以排序

二、双向多对一或者一对多

2.1配置:
@Entity
public class ProductDir {@Id@GeneratedValueprivate Long id;private String name;@OneToMany(mappedBy=”dir”)// @JoinColumn(name="dir_id")private Set<Product> products = new HashSet<Product>();@Entity
public class Product {@Id@GeneratedValueprivate Long id;private String name;@ManyToOne(fetch = FetchType.LAZY) // 实现延迟加载@JoinColumn(name = "dir_id")private ProductDir dir;
}
2.2保存代码案例:
public void testManytoOne2() throws Exception{//保存数据Product  product1= new Product();product1.setName("华硕飞行堡垒");Product product2 = new Product();product2.setName("联想拯救者");ProductDir dir = new ProductDir();dir.setName("笔记本电脑");//设置关系dir.getProducts().add(product1);dir.getProducts().add(product2);product1.setDir(dir);product2.setDir(dir);//保存EntityManager entityManager = JpaUtils.getEntityManager();entityManager.getTransaction().begin();//双向的entityManager.persist(dir);entityManager.persist(product1);entityManager.persist(product2);entityManager.getTransaction().commit();entityManager.close();
2.3级联操作
配置:
级联保存((mappedBy = "dir" 表示将外键的维护交给多方管理,dir表示多方中字段属性名,,cascade = CascadeType.PERSISIT 表示可以使用级联保存,除了PERSISIT,常用的还有ALL ,remove)
@OneToMany(mappedBy = "dir",cascade = CascadeType.PERSISIT)
@Test
public void testCascade() throws Exception{//保存数据Product  product1= new Product();product1.setName("被子");Product product2 = new Product();product2.setName("枕头");ProductDir dir = new ProductDir();dir.setName("床上用品");//设置关系dir.getProducts().add(product1);dir.getProducts().add(product2);product1.setDir(dir);product2.setDir(dir);//保存EntityManager entityManager = JpaUtils.getEntityManager();entityManager.getTransaction().begin();//双向的(保存乙方自动保存另外一方想关的)entityManager.persist(dir);entityManager.getTransaction().commit();entityManager.close();}

级联删除

@OneToMany(mappedBy = "dir",cascade = CascadeType.REOMOVE)
//级联删除:删除一方,然后级联删除多方
@Test
public void testDelete1() throws Exception{//删除分类7的时候,把多方也删除EntityManager entityManager = JpaUtils.getEntityManager();entityManager.getTransaction().begin();ProductDir productDir = entityManager.find(ProductDir.class, 1L);entityManager.remove(productDir);entityManager.getTransaction().commit();entityManager.close();

三、单向多对多

3.1配置
用户配置:
@Table(name="t_user")
public class User {@Id@GeneratedValueprivate Long id;private String name;@ManyToMany(fetch = FetchType.LAZY)@JoinTable(name="t_user_role",joinColumns ={@JoinColumn(name="user_id")},inverseJoinColumns = {@JoinColumn(name="role_id")})private Set<Role> roles = new HashSet<>();
角色:
@Entity
@Table(name="t_role")
public class Role {@Id@GeneratedValueprivate Long id;private String name;
3.2保存操作
public void testCreat() throws Exception{JpaUtil.getEntityManager();// 保存2个用户,保存3个角色(5条)User user1 = new User();user1.setName("猪儿虫");User user2 = new User();user2.setName("猪八戒");Role role1 = new Role();role1.setName("司机");Role role2 = new Role();role2.setName("演员");Role role3 = new Role();role3.setName("验黄师");// 保存中间表:建立用户到角色关系user1(role1,role2),user2(role1,role2,role3)(5条)user1.getRoles().add(role1);user1.getRoles().add(role2);user2.getRoles().add(role1);user2.getRoles().add(role2);user2.getRoles().add(role3);EntityManager entityManager = JpaUtil.getEntityManager();entityManager.getTransaction().begin();//保存用户entityManager.persist(user1);entityManager.persist(user2);// 保存角色entityManager.persist(role1);entityManager.persist(role2);entityManager.persist(role3);entityManager.getTransaction().commit();entityManager.close();}

四、双向的多对多

4.1配置:
//学生配置
@Entity
@Table(name = "t_student")
public class Student {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String name;//级联保存的配置@ManyToMany(cascade = CascadeType.ALL)@JoinTable(name="t_student_teacher",joinColumns = {@JoinColumn(name="stu_id")},inverseJoinColumns ={@JoinColumn(name = "t_id")})private Set<Teacher> tset = new HashSet<>();public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Teacher> getTset() {return tset;}public void setTset(Set<Teacher> tset) {this.tset = tset;}
//老师配置
@Entity
@Table(name="t_teacher")
public class Teacher {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@JoinColumn(name="t_name")private  String name;@ManyToMany(cascade = CascadeType.ALL)@JoinTable(name="t_student_teacher",joinColumns = {@JoinColumn(name="t_id")},inverseJoinColumns ={@JoinColumn(name = "stu_id")})private Set<Student> cont = new HashSet<>();public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Student> getCont() {return cont;}public void setCont(Set<Student> cont) {this.cont = cont;}
4.2级联操作和其他操作:
 //级联保存操作  需要的配置(@manytomany(cascade = CascadeType.PERSIST))PERSIST 表示只能级联保存,可以有all,remove配置@Testpublic void testAdd() throws Exception{EntityManager entityManager = JpaUtil.getEntityManager();Student student1 = new Student();Student student2 = new Student();Student student3 = new Student();student1.setName("王大锤");student2.setName("刘全有");student3.setName("张全蛋");Teacher teacher1 = new Teacher();Teacher teacher2 = new Teacher();teacher1.setName("孙悟空");teacher2.setName("邱少华");student1.getTset().add(teacher1);student1.getTset().add(teacher2);student2.getTset().add(teacher2);student2.getTset().add(teacher1);student3.getTset().add(teacher1);entityManager.getTransaction().begin();entityManager.persist(student1);entityManager.persist(student2);entityManager.persist(student3);entityManager.getTransaction().commit();}
 public void testDelete() throws Exception{//普通的删除(会删除查找的数据,并且删除Id相关表的关系链接)EntityManager entityManager = JpaUtil.getEntityManager();Student student = entityManager.find(Student.class, 1L);entityManager.getTransaction().begin();entityManager.remove(student);entityManager.getTransaction().commit();}//删除student2与teacher2的关联@Testpublic void testDelete2() throws Exception{EntityManager entityManager = JpaUtil.getEntityManager();Student student2 = entityManager.find(Student.class, 2L);Teacher teacher = entityManager.find(Teacher.class, 2L);entityManager.getTransaction().begin();student2.getTset().remove(teacher);entityManager.getTransaction().commit();}//删除student3的所有teacher相关的关系@Testpublic void testDelete3() throws Exception{EntityManager entityManager = JpaUtil.getEntityManager();Student student3 = entityManager.find(Student.class, 3L);entityManager.getTransaction().begin();student3.getTset().clear();entityManager.getTransaction().commit();}//级联删除@Testpublic void testJLdelete() throws Exception{//第一步配置级联删除EntityManager entityManager = JpaUtil.getEntityManager();Student student = entityManager.find(Student.class, 1L);entityManager.getTransaction().begin();entityManager.remove(student);entityManager.getTransaction().commit();}

五、Jpa的优化:
常用:
(1)尽量使用单向多对一去代替单向一对多
如果实在要使用双向的配置,尽量的一方放弃管理
(2)常用多对多的配置,中间表会自动产生,jointable
单向和双向
(3)一对一 看成特殊的 多对一 -->基本不用
注意:实在要使用一对一 尽量使用唯一的外键
(4)表字段尽量少,(有缓存),表不要怕多,jpa自动创建好这个关系

JPA3--双向与级联操作相关推荐

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

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

  2. jpa级联添加_JPA中的一对多双向关联与级联操作

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

  3. Hibernate @OneToMany 及 @Cascade级联操作

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:团队开发中的 Git 实践个人原创+1博客:点击前往,查看更多 作者:潘佳琦 链接:https://segmen ...

  4. Hibernate一对多关联映射及cascade级联操作

    我们以客户(Customer)与订单(Order)为例 实体类创建 Order订单实体类 //订单-----多的一方 public class Order {private Integer id;pr ...

  5. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  6. Hibernate学习-14:实体之间的关系及其配置,级联操作

    1.实体之间有三种关系: * 一对多: * 一个用户,生成多个订单,每一个订单只能属于一个用户. * 建表原则: * 在多的一方创建一个字段,作为外键,指向一的一方的主键. * 多对多: * 一个学生 ...

  7. Hibernate学习总结(5)——一对多的级联操作

    首先介绍一下一对多是什么,一对多关系是关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关. 例如:我有一 ...

  8. Hiberate 级联操作(cascade,many-to-one,one-to-many,many-to-many)

    使用的数据 建表语句 CREATE DATABASE Hibernate02; USE Hibernate02; CREATE TABLE `cut_customer`( `cust_id` bigi ...

  9. LINQ那些事儿(2)- 简单对象的CRUD操作和Association的级联操作

    从(1)我们看到,当生成entity class定义时,entity class或xml mapping文件中都已经完整的包含了entity和关系数据库的映射信息了,LINQ2SQL会根据这些信息来把 ...

最新文章

  1. pow函数gcc编译提示 undefined reference to `power' 的解决办法
  2. 华为防火墙USG多出口网络场景是如何排除故障的
  3. zookeeper学习一
  4. linux中负载值为多少正常_Linux系统中load average平均负载
  5. 程序设计实验与上机考试教程 全国计算机等级考试二级vb模拟试题,程序设计基础实验与上机考试教程...
  6. iOS 禁止手势滑动翻页
  7. 实施 or 开发 ?
  8. [转载] 2012年上半年信管网论文复习建议
  9. 电脑数据恢复软件推荐10款
  10. 2018 初入IT十年(上)----成为一名优秀的程序员
  11. Node.js基础入门第七天
  12. PetaLiunx配置时sourcing bitbake报错解决方法
  13. Cesium 1.87+实现建筑泛光效果
  14. 关于数学计算机手抄报简单的,关于数学的手抄报简单
  15. tm4c123gxl库函数调包侠养成(三)——————外部中断与按键
  16. PHP fscanf
  17. RHCSA-A2.配置默认软件仓库
  18. 各种屏幕录像软件使用教程及效果对比
  19. java项目friends_Java中Friend概念的实现
  20. 中国政府融资平台态势分析及发展前景规划评估研究报告2022-2028年版

热门文章

  1. Authorware与flash按钮的结合使用
  2. 给女生说一些关于软件测试职场的一些真实的建议~
  3. 高楼扔鸡蛋问题 - 动态规划+反推演绎
  4. SpringSecurity详细介绍RememberMe源码流程
  5. 支付宝pc端支付回调处理
  6. Linux网络编程入门
  7. 苹果手表与服务器连接中断,Apple Watch与iPhone连接不上怎么办【解决方案】
  8. 解密:最大规模互联网公司发币计划
  9. 小红帽系统搭建dns服务器,红帽7(centos 7 )配置DNS服务器
  10. 1.41亿老人遭受过虐待,厌老憎老为何成了时代病?