2013-03-15 104 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")注释可以在上面正从某个其他实体引用类的属性或字段一起使用。