81

我正在尝试使用 Hibernate 注释为我的数据库表编写模型类。

我有两个表,每个表都有一个主键用户和问题。

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

我怎样才能做到这一点?

4

3 回答 3

75

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

于 2013-03-15T07:31:36.203 回答
15

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

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

假设我们有父表 A 的第 1 列和另一个表 B 的第 2 列引用第 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;
于 2018-09-16T17:16:08.047 回答
2

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

于 2016-02-05T12:06:45.933 回答