代码之家  ›  专栏  ›  技术社区  ›  vikiiii

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

  •  85
  • vikiiii  · 技术社区  · 13 年前

    我正在尝试使用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
    }
    

    我如何才能做到这一点?

    3 回复  |  直到 7 年前
        1
  •  81
  •   JB Nizet    13 年前

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

        2
  •  16
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

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

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

    假设我们有一个列为1的父表A 以及另一个表B,其中第2列引用了第1列:

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

    Enter image description here

    @ManyToOne
    @JoinColumn(name = "bok_aut_id", referencedColumnName = "aut_id")
    private Author bok_aut_id;
    
        3
  •  2
  •   engin Naman    7 年前

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