3.JPA关系映射

开篇广告
自己开发的淘宝领券网站:q.hayye.cn(手机打开)
要说特色,应该没有,硬要说的话就是没广告、没推送,简单好用。
前端开源地址:https://gitee.com/hayye/tbq
后端不开源……
QQ群
欢迎大家加群讨论技术,不定时也会有淘宝神券发放!


正文开始

@OneToOne

一对一关联
主要可选属性参数如下:

cascade:级联操作策略;
fetch:数据获取方式;
mappedBy:被关联的属性;
targetEntity:目标类,xxx.class;

cascade:六个属性值可选,通过CascadeType.xxx调用;
fetch:延迟加载和立即加载两种形式,通过FetchType.xxx调用;
mappedBy:可以理解为被映射、被关联、被管理。意为当前类中没有关联关系,关系由另一方管理。而此处填的值就是另一方类中的本方对象名。

下面是一个例子:

@Entity
public class Teacher {
    @Id
    private Long t_id;
    private String t_name;

    @OneToOne(mappedBy = "teacher")
    private Student student;
    
    //省略getter setter...
}
    
@Entity
public class Student {
    @Id
    private Long s_id;
    private String s_name;
    
    @OneToOne(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "teacher_id", referencedColumnName = "t_id")
    private Teacher teacher;
    
    //省略getter setter...

生成的表如下:

teacher表

t_idt_name
nullnull

student表

s_ids_nameteacher_id
nullnullnull

可以看出:
Teacher类中使用了mappedBy属性,所以在teacher表中并没有任何其他表的属性外键,因为它被Student类中的teacher属性管理了!
再看Student类中使用了@JoinColumn注解

@JoinColumn

外键注解,主要属性如下:

name:必填,外键名;
referencedColumnName:非必填,关联的表的字段名;

该注解需配合@OneToOne,@OneToMany,@ManyToOne一起使用,单独使用无效。
当然了如果在上面关系注解中使用了mappedBy,用@JoinColumn是非法的,因为mappedBy就已经表示了改类没有外键!
例子中如果不使用@JoinColumn,将会使用默认策略生成外键。

@OneToMany

一对多关联,注解的用法与@OneToOne不太一样;

@Entity
public class Teacher {
    @Id
    private Long t_id;
    private String t_name;

    //省略getter setter...
}
    
@Entity
public class Student {
    @Id
    private Long s_id;
    private String s_name;
    
    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "student_id")
    @OrderBy("t_id DESC")
    private List<Teacher> teachers;
    
    //省略getter setter...
}

此例中在Student类中使用了@OneToMany和@JoinColumn,与上例不同的是@JoinColumn的用法,此处定义的name则是Teacher表中的外键名,因为一对多的关系,当然要在多的表里才能有外键了。
当然, @JoinColumn注解也可以省略,此时,默认策略就会生成第三张表,专门维护他们的关系。

@OrderBy

@OrderBy一般配合@OneToMany使用对集合中的数据进行排序。
值:就直接填一个属性值和排序方式ASC(升序)、DESC(降序)。

@ManyToOne

多对一,与OneToMany相对应。根据业务需求只需要在一放使用其中一个注解即可。

@Entity
public class Teacher {
    @Id
    private Long t_id;
    private String t_name;
    
    @ManyToOne
    @JoinColumn(name = "s_id")
    private Student student;
    
    //省略getter setter...
}
    
@Entity
public class Student {
    @Id
    private Long s_id;
    private String s_name;
    
    @OneToMany(mappedBy = "student")
    private List<Teacher> teachers;
    
    //省略getter setter...
}

@ManyToOne注解中没有mappedBy属性。
上例中可以省略掉Student中的@OneToMany,但如果需要双向关联使用,则必须改注解,同时需要标注mappedBy属性。

@ManyToMany

多对多,基本用法如出一辙。

@Entity
public class Teacher {
    @Id
    private Long t_id;
    private String t_name;
    
    @ManyToMany
    @JoinTable(name = "s_t",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "teacher_id"))
    private List<Student> students;
    
    //省略getter setter...
}
    
@Entity
public class Student {
    @Id
    private Long s_id;
    private String s_name;
    
    //省略getter setter...
}

@ManyToMany同样是支持mappedBy的,所以,如果需要双向关联,可在Student中使用mappedBy属性,此时的值应为关系表对应的类名。

@JoinTable

关联关系表的注解,主要属性如下:

name:关联关系表名;
joinColumns:主连接接表的外键;
inverseJoinColumns:被连接表的外键;

joinColumns和inverseJoinColumns的值都为@JoinColumn()注解。


双向关联:此文中双向关联并不代表在数据库中的双向外键关联,而是指对象之间的双向关联调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值