总结:以下提到JPA的注解

@Entity(name = “t_address”)
 @Id
 .@GeneratedValue(strategy = GenerationType.IDENTITY)>
 @OneToOne(cascade = CascadeType.ALL)
 @JoinColumn(name = “aid”,referencedColumnName = “aid”)
 @ManyToOne(cascade = CascadeType.ALL)
 @OneToMany(cascade = CascadeType.ALL)
 自己看看什么意思吧

一.前要:依赖和application配置

与上一章节相同

二. 一对一

实例:比如说一个学校有一个地址,一个地址只有一个学校。这就是一对一
那么我们可以按照如下方式来设计类

Address类

@Entity(name = "t_address")
    @Data
    public class Address {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer aid;
        private String province;
        private String city;
        private String area;
    }

School类

@Data
@Entity(name = "t_school")
public class School {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer sid;
    private String name;
    /**
     * 加了 @OneToOne 注解之后,系统会自动添加一个名为 address_aid 
     * 的字段,这个字段是一个外键,跟 address 关联,形成一对一。
     */
     //设置 address 和 school 之间是一对一的关系
    @OneToOne(cascade = CascadeType.ALL)
    //第一个 name 属性是指当前类中的 aid 属性
    //第二个属性是指所引用的外部类的属性名
    @JoinColumn(name = "aid",referencedColumnName = "aid")
    private Address address;
}
  1. @OneToOne注解:注解之后,系统会自动添加一个名为 address_aid 的字段,这个字段是一个外键,跟 address 关联,形成一对一
    2.一对一的关系,可以只在 School 中维护,也可以只在 Address 中维护,也可以两者都维护,具体哪种,那就看需求了。

在上面的例子中,我们在 School 和 Address 中都通过 @OneToOne 注解来维护了一对一的关系。

cascade 用来配置级联操作,有如下取值:

ALL:所有操作
PERSIST:级联添加
MERGE:级联更新
REMOVE:级联删除
REFRESH:级联刷新

看数据库图,实现了关联

spring 查询一对多的表关系 springdatajpa一对多_一对一

这时候看看我们的target包中的经过编译后的实体类
School.class

主要代码如下

@Entity(
    name = "t_school"
)
public class School {
    @Id
    @GeneratedValue(
        strategy = GenerationType.IDENTITY
    )
    private Integer sid;
    private String name;
    @OneToOne(
        cascade = {CascadeType.ALL}
    )
    @JoinColumn(
        name = "aid",
        referencedColumnName = "aid"
    )
    private Address address;

会发现自动给我们添加了一个注解@JoinColumn,这个注解有什么用?

通过 @JoinColumn 注解去指定关联关系,@JoinColumn 注解中的 name 表示的是当前类中的属性名,referencedColumnName 表示的则是 School 类中对应的属性名。

三.一对多

实例:一个班级中有多个学生,而一个学生只属于一个班级

Clazz

@Data
@Entity(name = "t_clazz")
public class Clazz {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer cid;
    private String name;
   /*这个注解将来会自动添加一个新表,
   新表中回来描述 clazz 和 student 的关联关系*/
    @OneToMany(cascade = CascadeType.ALL)
    private List<Student> students;

Student

@Data
@Entity(name = "t_student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer sid;
    private String name;
    //多对一
    //将来会自动给当前类添加一个属性,跟 clazz 关联起来
    @ManyToOne(cascade = CascadeType.ALL)
    private Clazz clazz;

如下图所示:自动生成了表,和中间表

spring 查询一对多的表关系 springdatajpa一对多_一对一_02


spring 查询一对多的表关系 springdatajpa一对多_一对一_03

注意:

1.Student 和 Clazz 的关系是多对一,用 @ManyToOne 注解,Clazz 和 Student 的关系是一对多,用
@OneToMany 注解。
2.Student 和 Clazz 的关系是多对一,将来的 t_student 表中会多出来一个属性 clazz_cid,通过这个外键将 Student 和 Clazz 关联起来。
3.如果我们不想要自动生成,也可以定义一个 cid 属性,并设置为不可编辑和不可添加,然后通过 @JoinColumn 注解配置 cid 属性为外键。