2013-03-15 37 views
56

我想使用hibernate註釋爲我的數據庫表編寫模型類。如何使用hibernate註釋創建外鍵約束?

我有兩個表,每個都有一個主鍵User和Question。

@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 
} 

問題表。

@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 

} 

而且我還有一個表,UserAnswer,其中有帳戶及questionId從上面兩個表的外鍵。

但我無法找到如何在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 
} 

請幫我實現這個目標嗎? 在此先感謝。

回答

51

@Column不是適當的註釋。您不希望將整個用戶或問題存儲在列中。你想創建一個實體之間的關聯。首先將Questions重命名爲Question,因爲一個實例代表一個問題,而不是幾個。然後創建關聯:

@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解釋說。閱讀。並閱讀註釋的javadoc。

+0

非常感謝您的回覆。是否有必要在表中創建一個新的列作爲useranswer_id?如果我可以將其他兩個ID作爲複合鍵,有可能嗎? – vikiiii 2013-03-15 07:43:51

+2

這是可能的,但它是糟糕的設計,痛苦,難以使用和效率低下。做正確的事情,併爲所有實體分配自動生成的單列ID。 – 2013-03-15 07:46:07

+0

@JB_Nizet我不介意給一個實體添加一個id列。但是,我需要在表中添加一列嗎?我的意思是oracle數據庫。 – vikiiii 2013-03-15 07:48:41

1

@Join column(name="reference_column_name")註釋可以在上面正從某個其他實體引用類的屬性或字段一起使用。