博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA 关系映射(一对一,一对多,多对多 )
阅读量:5325 次
发布时间:2019-06-14

本文共 4598 字,大约阅读时间需要 15 分钟。

CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除。

CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地更新Course中的数据。
CascadeType.DETACH 级联脱管/游离操作,如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
CascadeType.REFRESH 级联刷新操作,假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。
CascadeType.ALL 拥有以上所有级联操作权限。
一(被拥有方)mappedBy,mappedBy = "‘多’的实体类的属性字段",mappedBy 为被拥有方
多(拥有方) @JoinColumn
-----------------------------------------------------------------------

一对一
people 用户表(id,name,sex,birthday,address_id)
address 地址表(id,phone,zipcode,addr)
people 表
@Entity
public class People {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "id", nullable = false)
   private Long id;//id
   @Column(name = "name", nullable = true, length = 20)
   private String name;//姓名
   @Column(name = "sex", nullable = true, length = 1)
   private String sex;//性别
   @Column(name = "birthday", nullable = true)
   private Timestamp birthday;//出生日期
   @OneToOne(cascade=CascadeType.ALL)
   //People是关系的维护端,当删除 people,会级联删除 address
   @JoinColumn(name = "address_id", referencedColumnName = "id")
   //name:关联id,referencedColumnName:地址表id
   private Address address;//地址
}
关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedColumnName属性。
当然这里关联实体(Address)的主键 id 是用来做主键,所以这里第23行的 referencedColumnName = "id" 实际可以省略。
address 表
@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;//id
    @Column(name = "phone", nullable = true, length = 11)
    private String phone;//手机
    @Column(name = "zipcode", nullable = true, length = 6)
    private String zipcode;//邮政编码
    @Column(name = "addr", nullable = true, length = 100)
    private String addr;//地址
    //如果不需要根据Address级联查询People,可以注释掉,mappedBy = "People实体类中address属性"
//    @OneToOne(mappedBy = "address", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)
//    private People people;
}
-----------------------------------------------------------------------
一对多
author 作者表(id,name)
article 文章表(id,title,conten,author_id)
author 表
@Entity
public class Author {
    @Id // 主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增长策略
    private Long id; //id
    @NotEmpty(message = "姓名不能为空")
    @Size(min=2, max=20)
    @Column(nullable = false, length = 20)
    private String name;//姓名
    //mappedBy = "Article实体类中author属性"
    @OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    //级联保存、更新、删除、刷新;延迟加载。当删除用户,会级联删除该用户的所有文章
    //拥有mappedBy注解的实体类为关系被维护端
    private List<Article> articleList;//文章列表
}
article 表
    @Entity
    public class Article {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增长策略
        @Column(name = "id", nullable = false)
        private Long id;
        @NotEmpty(message = "标题不能为空")
        @Size(min = 2, max = 50)
        @Column(nullable = false, length = 50) // 映射为字段,值不能为空
        private String title;
        @Lob  // 大对象,映射 MySQL 的 Long Text 类型
        @Basic(fetch = FetchType.LAZY) // 懒加载
        @NotEmpty(message = "内容不能为空")
        @Size(min = 2)
        @Column(nullable = false) // 映射为字段,值不能为空
        private String content;//文章全文内容
        //可选属性optional=false,表示author不能为空。删除文章,不影响用户
        @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
        //author_id关联author的id字段
    @JoinColumn(name = "author_id", referencedColumnName = "id")
        private Author author;//所属作者
    }
-----------------------------------------------------------------------

多对多(可以随意指定一方为关系维护端 @JoinColumn)
user 用户表(id,username,password)
user_authority 中间表(user_id,authority_id)
authority 权限表(id,authname)
User.java
    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @NotEmpty(message = "账号不能为空")
        @Size(min=3, max=20)
        @Column(nullable = false, length = 20, unique = true)
        private String username; // 用户账号,用户登录时的唯一标识
        @NotEmpty(message = "密码不能为空")
        @Size(max=100)
        @Column(length = 100)
        private String password; // 登录时密码
        @ManyToMany
        @JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "authority_id"))
        //关系维护端,负责多对多关系的绑定和解除,即实现User.setAuthorityList(authority)
        // @JoinTable name:关联表的名字,joinColumns:关联User表的id,inverseJoinColumns:关联Authority表的id
        private List<Authority> authorityList;
    }
Authority.java
    @Entity
    public class Authority {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        @Column(nullable = false)
        private String authname; //权限名
    //mappedBy = "User实体类中authorityList属性"
        @ManyToMany(mappedBy = "authorityList")
        private List<User> userList;
    }
-------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/supiaopiao/p/10639884.html

你可能感兴趣的文章
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
点击复制插件clipboard.js
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>