Sringboot JPA实体类关系映射

简介: Springboot-Data-JPA是在工作中经常使用到的ORM框架,我觉的比较好用的点是其集成了大量的对数据库的简单操作,基本满足对数据增删改的需要,JPA关系的映射使用注解的方式,很大程度上提高了代码的可读性。 这里的address是一个Address(地址实体类),"JoinColumn"属性会在当前的student表中添加一个addressId字段,这个字段会和"referencedColumnName"设置的"id"属性进行关联(即addressId关联id属性),实现学生实体和地

 文章目录

一、简介

二、关系类型

1.一对一(@OneToOne)

2.一对多(@OneToMany/@ManyToOne)

3.多对多(@ManyToMany)

易发问题


一、简介

       Springboot-Data-JPA是在工作中经常使用到的ORM框架,我觉的比较好用的点是其集成了大量的对数据库的简单操作,基本满足对数据增删改的需要,JPA关系的映射使用注解的方式,很大程度上提高了代码的可读性。

二、关系类型

1.一对一(@OneToOne)

       这里的address是一个Address(地址实体类),"JoinColumn"属性会在当前的student表中添加一个addressId字段,这个字段会和"referencedColumnName"设置的"id"属性进行关联(即addressId关联id属性),实现学生实体和地址实体的一对一关联。

package com.heitao.base.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.util.Set;
/**
 * @author seaua
 * @description:学生实体类
 * @date 2022/12/7 下午2:52
 * Implements{@link }
 * extend{@link }
 **/
@Entity
public class Student {
    
    /** 
     * PARAM:{@param id} [主键ID] TYPE: {@link Integer}
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    /** 
     * PARAM:{@param address} [AddressId] TYPE: {@link Address}
     */
    @OneToOne
    @JoinColumn(name="addressId",referencedColumnName="id")
    private Address address;
    /** 
     * PARAM:{@param clazz} [班级] TYPE: {@link Clazz}
     */
    @ManyToOne
    @JoinColumn(name = "cid")
    @JsonIgnoreProperties("list")
    private Clazz clazz;
    /** 
     * PARAM:{@param course} [课程表] TYPE: {@link Set<Course>}
     */
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinTable(name = "stu_cou", joinColumns = {@JoinColumn(name = "stu_id")}, inverseJoinColumns = {@JoinColumn(name = "cou_id")})
    @JsonIgnoreProperties({"student"})
    private Set<Course> courses;
}

image.gif

2.一对多(@OneToMany/@ManyToOne)

       一个班级内有多个学生,多个学生在一个班级内,故学生和班级是多对一,教室和学生是一对多的关系。JPA通过@OneToMany标识一对多,通过@ManyToOne标识多对一。@JoinColum注解用在多的一方,表示在表中添加一个字段与class表的主键ID(默认)产生关联。mappedBy属性用在多方,值为关联实体类中当前类的名称(不可以错),fetch属性表示以积极(FetchType.EAGER)或懒加载(FetchType.LAZY)模式加载,@JsonIgnoreProperties({"clazz"})表示在循环关联时,遇到clazz变量则终止Json解析。

package com.heitao.base.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.util.List;
/**
 * @author seaua
 * @description:班级-实体类
 * @date 2022/12/7 下午2:52
 * Implements{@link }
 * extend{@link }
 **/
@Entity
public class Clazz {
    /** 
     * PARAM:{@param cid} [主键ID] TYPE: {@link Integer}
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer cid;
    /** 
     * PARAM:{@param className} [教室名] TYPE: {@link className}
     */
    private String className;
    /** 
     * PARAM:{@param list} [学生列表] TYPE: {@link list}
     */
    @OneToMany(mappedBy = "clazz",fetch = FetchType.EAGER)
    @JsonIgnoreProperties({"clazz"})
    private List<Student> list;
}

image.gif

3.多对多(@ManyToMany)

       一名学生(Student)可以选修多门课程(Course),一门课程(Course)可以被多个学生选修(Student),课程和学生互为多对多的关系。在Student使用@JoinTable注解来创建多对多中间表,

joinColumns,inverseJoinColumns表示两个关联表中的两个字段名(默认关联主键)。

package com.heitao.base.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import javax.persistence.*;
import java.util.Set;
/**
 * @author seaua
 * @description:课程-实体类
 * @date 2022/12/7 下午2:52
 * Implements{@link }
 * extend{@link }
 **/
@Entity
@Getter
@Setter
public class Course {
    /** 
     * PARAM:{@param id} [主键ID] TYPE: {@link Integer}
     */    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    /** 
     * PARAM:{@param courseName} [课程名称] TYPE: {@link String}
     */   
    private String courseName;
    /** 
     * PARAM:{@param students} [学生列表] TYPE: {@link Set<Student>}
     */   
    @ManyToMany(fetch = FetchType.EAGER,mappedBy = "course")
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnoreProperties({"course"})
    private Set<Student> students;
}

image.gif

易发问题

1.为解决依赖关系的死循环问题,使用@JsonIgnoreProperties({"clazz"})注解,{}内为与之关联的变量名称(注意为变量名称)。

2.一对多关系,多端类使用@JoinColumn(name = "cid")注解添加外键字段。多对对关系,任意多端使用@JoinTable(name = "stu_cou", joinColumns = {@JoinColumn(name = "stu_id")}, inverseJoinColumns = {@JoinColumn(name = "cou_id")})注解添加关系联系表,该注解会自动生成一个已两端主键作为关系的主键表。(以上注解表示y生成一个stu_cou表,使用student的主键和coruse的主键作为主键创建关系。)

3.mappedBy的值是关系类的变量名。

目录
相关文章
|
SQL Java 数据库
Springboot整合JPA 多表关联操作 @Query
Springboot整合JPA 多表关联操作 @Query
1421 0
Springboot整合JPA 多表关联操作 @Query
|
7月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
610 4
|
7月前
|
存储 Java API
小试牛刀-SpringBoot集成SOL链
java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!
262 1
|
7月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
321 0
|
7月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
203 1
Linux系统性能调优技巧和相关工具
|
7月前
|
存储 算法 fastjson
火点监测:Nasa高分卫星接入
NASA(美国国家航空航天局)是美国联邦政府的一个独立机构,负责国家的航空航天研究和探索任务。NASA成立于1958年,其使命是探索太空并推动科学技术的发展。NASA的主要任务包括研究地球和太空的物理特性、开发和测试航空航天技术、进行太空探索和科学研究,以及促进航空航天技术的应用和技术转移。这里使用其开发的系统firms(火灾资源管理系统),通过Http请求获取数据来实现火点的监测,帮助需要实现相关功能,有类似开发任务的朋友。
218 6
|
7月前
|
Python
小试牛刀-Python生成solana Wallet公私钥
在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。
190 5
|
7月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
248 5
|
7月前
|
开发框架 Rust JavaScript
小试牛刀-Anchor安装和基础测试
Anchor是一个SOL链的开发框架,可以很方便的完成链上程序(Program)的编写,并且可以进行快速的前端测试。但安装时需要很多步骤,并且在测试时也有些错误需要注意。在这里对步骤和相关版本进行记录,作为记录和过程分享。
259 4
|
7月前
|
传感器 定位技术 数据格式
常用通信协议及数据格式
常用通信协议和格式总结
584 2