1. 一对一关联
现假设有Person表和Address表,是一对一的关系,在Person中有一个指向Address表主键的字段addressID,所以主控方一定是Person,所谓主控方就是能改变关联关系的一方,Person只要改变addressID就改变了关联关系,所以Person是主控方,所以@JoinColumn写在Person类中
@Data
@Entity
@Table(name = "person")
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Column(name = "address_id")
private String addressId;
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="address_id")//注释本表中指向另一个表的外键。
private Address address;
}
2、一对多单向关联
若Person和Address表是一对多的关系,则表示一个Person下包含多个Address,即在Address表中包含person_id字段。
一对多的关系,所以站在一的角度,也就是Person的角度,在Person类中加入@JoinColumn。
@Data
@Entity
@Table(name = "person")
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="person_id")//注释的是另一个表指向本表的外键。
private List<Address> addresss;
}
3、多对一的关联关系
若Person和Address表是一对多的关系,则表示一个Person下包含多个Address,即在Address表中包含person_id字段。
多对一的关系,所以站在多的角度,也就是Address的角度,在Address类中加入@JoinColumn
@Data
@Entity
@Table(name = "address")
public class Address{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Column(name = "address")
private String address;
@ManyToOne
@JoinColumn(name="person_id")//注释的是本表的外键。
private Person person;
}
4、使用中间表的一对多关联
Person、Pserson_Address、Address三张表,Person和Address为一对多关系,则配置如下
@Data
@Entity
@Table(name = "person")
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@OneToMany(cascade = CascadeType.ALL)
@WhereJoinTable(clause = "status = 1")
@JoinTable(name = "person_address",
joinColumns = {@JoinColumn(name = "person_id")},
inverseJoinColumns = {@JoinColumn(name = "address_id")})
private List<Address> addresss;
}
JoinTable 中 name指中间表名称,joinColumns指定中间表中关联自己ID的字段,inverseJoinColumns表示中间表中关联对方ID的字段;多对一的翻过来即可。WhereJoinTable(clause = "status = 1") 表示筛选中间表status=1的字段进行连接查询。
5、一对多双向
单向一对多关系:是一包含多方的信息,而多方没有一方的信息,即在Address方无Person信息。只需在Address类中加入多对一的注解即可
@Data
@Entity
@Table(name = "address")
public class Address{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Column(name = "address")
private String address;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name="person_id")
private Person person;
}
6、多对多单向关系
多对多的关系都是以中间表的形式进行维护,如Person Person_Address Address三者的关系,Person和Address为多对多关系。
@Data
@Entity
@Table(name = "person")
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@ManyToMany(cascade=CascadeType.ALL)
@WhereJoinTable(clause = "status = 1")
@JoinTable(name = "person_address",
joinColumns = {@JoinColumn(name = "person_id")},
inverseJoinColumns = {@JoinColumn(name = "address_id")})
private List<Address> addresss;
}
则在Address表中6亦可进行相关配置。