总结:以下提到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;
}
- @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;
/*这个注解将来会自动添加一个新表,
新表中回来描述 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;
如下图所示:自动生成了表,和中间表
注意:
1.Student 和 Clazz 的关系是多对一,用 @ManyToOne 注解,Clazz 和 Student 的关系是一对多,用
@OneToMany 注解。
2.Student 和 Clazz 的关系是多对一,将来的 t_student 表中会多出来一个属性 clazz_cid,通过这个外键将 Student 和 Clazz 关联起来。
3.如果我们不想要自动生成,也可以定义一个 cid 属性,并设置为不可编辑和不可添加,然后通过 @JoinColumn 注解配置 cid 属性为外键。