1.java和jpa 中所有的关系都是单向的。这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的。
2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类似,但反向关系(如果已定义)是ManyToOne关系。
OneToMany与JPA中ManyToMany关系的主要区别在于,ManyToMany总是使用中间关系连接表来存储关系,
OneToMany可以使用连接表或者目标对象的表引用中的外键源对象表的主键。
@OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "OPR_WARE_SYSCONFIG_ID",foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private List<WarehouseVO> warehouse;
wareHouseVO的表通过外键字段关联,而定义了OneToMany的属性的VO则不需要添加表字段。
ManyToOne:
@ManyToOne @JoinColumn(name = "OPR_WAREHOUSE_ENV_ID") private EnvironmentVO env ;
总结,作为many的一方需要有外键关联One的一方。
@ManyToMany 注解
manyToMany需要和@JoinTable表结合使用,ManyToMany总是使用中间关系连接表来存储关系。如果两个Vo都定义了ManyToMany的话,因为单向关系,会生成有2个中间表。所以需要改造成双向关系,使其只存在一个中间表。
例子:
a:一方不需要mappedBy属性,一方需要。
@ManyToMany @JoinTable(name = "AUTO_SYSTEM", joinColumns = { @JoinColumn(name = "OPR_AUTO_ID") }, inverseJoinColumns = { @JoinColumn(name = "OPR_SYSTEM_ID") }, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private List<SystemVO> systems; @ManyToMany(mappedBy = "students") private List<Service> services;
b:
@Entity public class Student { @Id private String id; @ManyToMany @JoinTable private List<Teacher> teachers; } @Entity public class Teacher { @Id private String id; @ManyToMany @JoinTable private List<Student> students; }
@ManyToMany即表示了老师和学生的多对多关系。@ManyToMany注解可以用在字段或方法上
但是这样会有两个表出现,TEACHER_STUDENTS表和STUDENT_TEACHERS。
原因是这里的多对多关系正是维基百科提到的单向原则。老师和学生虽然分别定义了自己的多对多关系,但这个关系都是单向的,要使关系成为双向。
mappedBy 属性
mappedBy是OneToOne、OneToMany和ManyToMany这三种关联关系的属性。
用来标注拥有这种关系的字段。 除非关系是单向的,否则是必需的。
什么叫拥有关联关系呢,假设是双向一对一的话,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力。而另一方没有,只能被动管理。
由于JoinTable和JoinColumn一般定义在拥有关系的这一端,而mappedBy一定是定义在关系的被拥有方(the owned side),也就是跟定义JoinTable
和JoinColumn互斥的一方,它的值指向拥有方中关于被拥有方的字段,可能是一个对象(OneToMany),也可能是一个对象集合(ManyToMany)。
@Entity public class Student { @Id private String id; @ManyToMany(mappedBy = "students") private List<Teacher> teachers; } @Entity public class Teacher { @Id private String id; @ManyToMany @JoinTable(“student”) private List<Student> students; }
这时中间表只有一张TEACHER_STUDENTS,关联关系也变成了我们想要的双向关系。
Cascade 级联关系
实际业务中,我们通常会遇到以下情况:
1.用户和用户的收货地址是一对多关系,当用户被删除时,这个用户的所有收货地址也应该一并删除。
2.订单和订单中的商品也是一对多关系,但订单被删除时,订单所关联的商品肯定不能被删除。
此时只要配置正确的级联关系,就能达到想要的效果。
级联关系类型:
需要注意的是,CascadeType.ALL要谨慎使用,为了达到数据同步,很多人喜欢用CascadeType.ALL来实现。但上面订单和商品的例子就不适用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java switch关键字原理及用法详解,包括了Java switch关键字原理及用法详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java中 switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少。关于swi
本文向大家介绍Android中Messenger原理及基本用法详解,包括了Android中Messenger原理及基本用法详解的使用技巧和注意事项,需要的朋友参考一下 这边博客主要记录一下Android中Messenger的基本原理和用法。 简单来讲,Messenger其实就是Binder通信的包装器,是一种基于消息传递的进程间通信工具。 通常情况下,我们可以在A进程中创建一个Messenger,
本文向大家介绍Spring jackson原理及基本使用方法详解,包括了Spring jackson原理及基本使用方法详解的使用技巧和注意事项,需要的朋友参考一下 导入maven依赖 1、java对象转json 2、writeValue(参数1,obj)方法介绍 参数1 File:将obj对象转换为json字符串,并保存到指定的文件中 writer:将obj对象转换为json字符串,并将json数
本文向大家介绍Spring JdbcTemplate整合使用方法及原理详解,包括了Spring JdbcTemplate整合使用方法及原理详解的使用技巧和注意事项,需要的朋友参考一下 基本配置 JdbcTemplate基本用法实际上很简单,开发者在创建一个SpringBoot项目时,除了选择基本的Web依赖,再记得选上Jdbc依赖,以及数据库驱动依赖即可,如下: 项目创建成功之后,记得添加Drui
本文向大家介绍Android HandlerThread的使用及原理详解,包括了Android HandlerThread的使用及原理详解的使用技巧和注意事项,需要的朋友参考一下 一、HandlerThread的含义 HandlerThread能够新建拥有Looper的线程。这个Looper能够用来新建其他的Handler。(线程中的Looper)需要注意的是,新建的时候需要被回调。 二、Hand
本文向大家介绍Bootstrap3 Grid system原理及应用详解,包括了Bootstrap3 Grid system原理及应用详解的使用技巧和注意事项,需要的朋友参考一下 刚开始用Bootstrap的格子系统写布局的时候遇到了这样一个问题: 我的页面中有这样一个布局 我希望当屏幕的宽度小于他们俩宽度之和的时候,右边的部分会掉下来,他们垂直摆放。 而我用col-xs-6的话,右边的盒子永远都