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亦可進行相關配置。