如何使用Hibernate批注标记外键约束?


75

我正在尝试使用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,其中有来自上面两个表的userId和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
}

我该如何实现?

Answers:


67

@Column不是适当的注释。您不想在列中存储整个用户或问题。您要在实体之间创建关联。首先重命名QuestionsQuestion,因为一个实例代表一个问题,而不是多个问题。然后创建关联:

@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文档解释了。阅读。并阅读注释的javadoc。


非常感谢您的回复。是否有必要在表中创建一个新列作为useranswer_id?如果可以将其他两个ID用作复合键,是否可以?
vikiiii

3
可能,但是设计不好,痛苦,难以使用且效率低下。做正确的事,并为您的所有实体分配一个自动生成的单列ID。
JB Nizet

@JB_Nizet我不介意将id列添加到实体。但是我还需要在表中添加一列吗?我的意思是oracle数据库。
vikiiii

当然是。如果对应列不存在,Hibernate会将实体的ID存储在哪里?
JB Nizet

我问我的团队负责人。我无法添加该列。我必须使它们成为复合键。我尝试使用@EmbeddedId和@Embeddable。但是我遇到了一个休眠异常
vikiiii

6

答案很多,而且都是正确的。但不幸的是,他们都没有明确的解释。

以下内容也适用于非主键映射。

假设我们有一个具有第1列的父表A和一个具有第2列的父表B,该表引用第1列:

@ManyToOne
@JoinColumn(name = "TableBColumn", referencedColumnName = "TableAColumn")
private TableA session_UserName;

在此处输入图片说明

@ManyToOne
@JoinColumn(name = "bok_aut_id", referencedColumnName = "aut_id")
private Author bok_aut_id;

2

@JoinColumn(name="reference_column_name") 可以在从其他实体引用的类的属性或字段的上方使用注释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.