wake-up-neo.com

Wie kann ich eine Fremdschlüsseleinschränkung mithilfe von Hibernate-Annotationen markieren?

Ich versuche, Hibernate-Annotation zum Schreiben einer Modellklasse für meine Datenbanktabellen zu verwenden.

Ich habe zwei Tabellen mit jeweils einem Primärschlüssel Benutzer und Frage.

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

Fragentabelle.

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

Und ich habe eine weitere Tabelle, UserAnswer, die userId und questionId als Fremdschlüssel aus den beiden obigen Tabellen enthält.

Ich kann jedoch nicht feststellen, wie ich auf diese Einschränkungen in der UserAnswer-Tabelle verweisen kann.

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

Wie kann ich das erreichen?

68
vikiiii

@Column ist nicht die passende Anmerkung. Sie möchten nicht einen ganzen Benutzer oder eine ganze Frage in einer Spalte speichern. Sie möchten eine Zuordnung zwischen den Entitäten erstellen. Benennen Sie zunächst Questions in Question um, da eine Instanz eine einzelne Frage darstellt und nicht mehrere. Dann erstelle die Assoziation:

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

Die Ruhezustand Dokumentation erklärt das. Lies es. Lesen Sie auch den Javadoc der Anmerkungen.

59
JB Nizet

Es gibt viele Antworten und alle sind auch richtig. Leider hat keiner von ihnen eine klare Erklärung.

Das Folgende funktioniert auch für eine Nicht-Primärschlüsselzuordnung.

Angenommen, wir haben die übergeordnete Tabelle A mit Spalte 1 und eine weitere Tabelle B mit Spalte 2, die auf Spalte 1 verweist:

@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") Annotation kann über der Eigenschaft oder dem Feld der Klasse verwendet werden, auf die von einer anderen Entität verwiesen wird.

1
Shivam Sugandhi