栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

(三)springDataJPA的一对一,一对多

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(三)springDataJPA的一对一,一对多

总结:以下提到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;
    
     //设置 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:级联刷新

看数据库图,实现了关联

这时候看看我们的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;
   
    @OneToMany(cascade = CascadeType.ALL)
    private List 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;

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

注意:

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

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号