データベーステーブルのモデルクラスを記述するために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
は適切な注釈ではありません。ユーザーまたは質問全体を列に保存したくありません。エンティティ間の関連付けを作成します。インスタンスは複数の質問ではなく単一の質問を表すため、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も読んでください。
多くの答えがあり、すべて正しいです。しかし、残念ながらそれらのどれも明確な説明がありません。
以下は、非プライマリキーマッピングでも機能します。
列1を持つ親テーブルAと、列1を参照する列2を持つ別のテーブルBがあるとします。
@ManyToOne
@JoinColumn(name = "TableBColumn", referencedColumnName = "TableAColumn")
private TableA session_UserName;
@ManyToOne
@JoinColumn(name = "bok_aut_id", referencedColumnName = "aut_id")
private Author bok_aut_id;
@JoinColumn(name="reference_column_name")
注釈は、他のエンティティから参照されているクラスのプロパティまたはフィールドの上で使用できます。