web-dev-qa-db-ja.com

Hibernateアノテーションを使用して外部キー制約をマークするにはどうすればよいですか?

データベーステーブルのモデルクラスを記述するためにHibernateアノテーションを使用しようとしています。

2つのテーブルがあり、それぞれに主キー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
}

そして、もう1つのテーブルUserAnswerがあります。このテーブルには、上記の2つのテーブルの外部キーとして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
}

どうすればこれを達成できますか?

68
vikiiii

@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 documentation はそれを説明しています。それを読んで。また、注釈のjavadocも読んでください。

59
JB Nizet

多くの答えがあり、すべて正しいです。しかし、残念ながらそれらのどれも明確な説明がありません。

以下は、非プライマリキーマッピングでも機能します。

列1を持つ親テーブルAと、列1を参照する列2を持つ別のテーブルBがあるとします。

@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
Vaibhav Jain

@JoinColumn(name="reference_column_name")注釈は、他のエンティティから参照されているクラスのプロパティまたはフィールドの上で使用できます。

1
Shivam Sugandhi