2013-03-15 31 views
56

Tôi đang cố gắng sử dụng chú thích ngủ đông để viết một lớp mô hình cho các bảng cơ sở dữ liệu của tôi.Làm cách nào để tạo một ràng buộc khóa ngoài bằng cách sử dụng chú thích ngủ đông?

Tôi có hai bảng có mỗi Người dùng và Câu hỏi chính.

@Entity 
@Table(name="USER") 
public class User 
{ 
    @Id 
    @Column(name="user_id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(name="username") 
    private String username; 

    // getter and setter 
} 

Bảng câu hỏi.

@Entity 
@Table(name="QUESTION") 
public class Questions extends BaseEntity{ 

    @Id 
    @Column(name="question_id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @Column(name="question_text") 
    private String question_text; 

    // getter and setter 

} 

Và tôi có thêm một bảng, UserAnswer, trong đó có userId và questionId là khóa ngoại từ hai bảng trên.

Nhưng tôi không thể tìm thấy cách tôi có thể tham chiếu các ràng buộc này trong bảng UserAnswer.

@Entity 
@Table(name="UserAnswer ") 
public class UserAnswer 
{ 

    @Column(name="user_id") 
    private User user; 

    //@ManyToMany 
    @Column(name="question_id") 
    private Questions questions ; 

    @Column(name="response") 
    private String response; 

    //getter and setter 
} 

Hãy giúp tôi đạt được điều này? Cảm ơn trước.

Trả lời

51

@Column không phải là chú thích thích hợp. Bạn không muốn lưu trữ toàn bộ người dùng hoặc câu hỏi trong một cột. Bạn muốn tạo liên kết giữa các thực thể. Bắt đầu bằng cách đổi tên Questions thành Question, vì một cá thể đại diện cho một câu hỏi duy nhất chứ không phải một số câu hỏi. Sau đó, tạo liên kết:

@Entity 
@Table(name = "UserAnswer") 
public class UserAnswer { 

    // this entity needs an ID: 
    @Id 
    @Column(name="useranswer_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "question_id") 
    private Question question; 

    @Column(name = "response") 
    private String response; 

    //getter and setter 
} 

Hibernate documentation giải thích điều đó. Đọc nó. Và cũng đọc javadoc của các chú thích.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Có cần phải tạo cột mới trong bảng là useranswer_id không? Có thể nếu tôi có thể tạo hai id khác làm khóa tổng hợp? – vikiiii

+2

Có thể, nhưng thiết kế xấu, đau đớn, khó sử dụng và không hiệu quả. Làm điều đúng và gán một ID cột đơn, được tạo tự động cho tất cả các thực thể của bạn. –

+0

@JB_Nizet Tôi không nhớ thêm cột id vào thực thể. Nhưng tôi cần phải thêm một cột trong bảng? Tôi có nghĩa là cơ sở dữ liệu oracle. – vikiiii

1

Chú thích @Join column(name="reference_column_name") có thể được sử dụng phía trên thuộc tính hoặc trường của lớp đang được tham chiếu từ một số pháp nhân khác.

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