Jpa 相關注解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章