1. ホーム
  2. java

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

2023-08-16 14:56:44

質問

データベーステーブルのモデルクラスを書くために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
}

どうすれば実現できるのでしょうか?

どのように解決するのですか?

@Column は適切なアノテーションではありません。ユーザーまたは質問全体を列に格納したいわけではありません。エンティティ間の関連付けを作成したいのです。名前を変更することから始めましょう。 QuestionsQuestion に変更します。インスタンスは1つの質問を表し、複数の質問は表さないからです。そして、関連付けを作成します。

@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も読んでください。