web-dev-qa-db-fra.com

Comment marquer une contrainte de clé étrangère en utilisant des annotations Hibernate?

J'essaie d'utiliser l'annotation Hibernate pour écrire une classe de modèle pour mes tables de base de données.

J'ai deux tables, chacune ayant une clé primaire Utilisateur et 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
}

Table de questions.

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

Et j'ai une autre table, UserAnswer, qui contient les identificateurs userId et questionId en tant que clés étrangères des deux tableaux ci-dessus.

Mais je ne parviens pas à trouver comment référencer ces contraintes dans la table 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
}

Comment puis-je atteindre cet objectif?

68
vikiiii

@Column n'est pas l'annotation appropriée. Vous ne souhaitez pas stocker un utilisateur ou une question dans une colonne. Vous voulez créer une association entre les entités. Commencez par renommer Questions en Question, car une instance représente une seule question et non plusieurs. Puis créez l'association:

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

Le documentation d'Hibernate explique cela. Lis le. Et aussi lire le javadoc des annotations.

59
JB Nizet

Il y a beaucoup de réponses et toutes sont correctes. Mais malheureusement, aucun d’eux n’a une explication claire.

Ce qui suit fonctionne également pour un mappage de clé non primaire.

Disons que nous avons la table parent A avec la colonne 1 et une autre table, B, avec la colonne 2 qui fait référence à la colonne 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
Vaibhav Jain

L'annotation @JoinColumn(name="reference_column_name") peut être utilisée au-dessus de cette propriété ou de ce champ de classe référencé à partir d'une autre entité.

1
Shivam Sugandhi