2015-05-17 18 views
7

@JoinColumn cung cấp Entity khóa ngoài cho Entity khác trong khi @JoinTable sẽ liệt kê mối quan hệ giữa tất cả các mối quan hệ giữa Entity A và Entity B. Theo như tôi có thể nói, cả hai đều có vẻ giống nhau. Khi nào tôi nên sử dụng cái này hay cái kia?Khi nào tôi nên sử dụng @JoinColumn hoặc @JoinTable?

Trả lời

12

Hãy nói rằng bạn có một thực thể A trong đó có một hiệp hội @ManyToOne ot một thực thể B

@JoinColumn sẽ xác định các bảng mục tiêu Ngoại chính (ví dụ B_ID) trong khi sử dụng các bảng mục tiêu Entity (ví dụ B).

@Entity 
public class A { 

    private Long id; 

    @ManyToOne 
    @JoinColumn(name="B_ID") 
    private B b; 

} 

@JoinTable sẽ sử dụng một bảng riêng biệt để giữ mối quan hệ giữa AB.

@Entity 
public class A { 

    private Long id; 

    @ManyToOne 
    @JoinTable(
     name = "A_B", 
     joinColumns = @JoinColumn(name = "B_ID"), 
     inverseJoinColumns = @JoinColumn(name = "A_ID") 
    ) 
    private B b; 

} 

Lần này không phải A cũng không B chứa bất kỳ chính nước ngoài, bởi vì có một bảng riêng biệt (ví dụ A_B) để giữ mối liên hệ giữa AB.

+0

do đó, một JoinTable là một mối quan hệ N-N? – julestruong

+0

Trong thuật ngữ cơ sở dữ liệu, đó là một liên kết nhiều-nhiều. Trong trường hợp này, một FK sẽ có một ràng buộc duy nhất để biến nó thành một liên kết một-nhiều với một bảng kết nối. –

3

@JoinTable lưu trữ id của cả hai bảng vào một bảng riêng biệt trong khi @JoinColumn lưu trữ id của bảng khác trong cột mới.

@JoinTable: Đây là loại mặc định. Sử dụng điều này khi bạn cần một cơ sở dữ liệu chuẩn hóa hơn. I E. để giảm dự phòng.

@JoinColumn: Sử dụng tính năng này để có hiệu suất tốt hơn vì không cần phải tham gia thêm bảng.

Các vấn đề liên quan