Wie kann ich eine Fremdschlüsseleinschränkung mithilfe von Annotationen im Ruhezustand markieren?

75

Ich versuche, die Annotation Hibernate 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
}

Fragetabelle.

@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 noch eine Tabelle, UserAnswer, die userId und questionId als Fremdschlüssel aus den beiden oben genannten Tabellen hat.

Ich kann jedoch nicht finden, 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?

vikiiii
quelle

Antworten:

67

@Columnist nicht die entsprechende 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. Beginnen Sie mit dem Umbenennen Questionsin Question, da eine Instanz eine einzelne Frage darstellt und nicht mehrere. Erstellen Sie dann die Zuordnung:

@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 Hibernate-Dokumentation erklärt dies. Lies es. Und lesen Sie auch das Javadoc der Anmerkungen.

JB Nizet
quelle
Vielen Dank für Ihre Antwort. Muss eine neue Spalte in der Tabelle als useranswer_id erstellt werden? Ist es möglich, wenn ich die anderen beiden IDs als zusammengesetzte Schlüssel erstellen kann?
Vikiiii
3
Es ist möglich, aber es ist schlechtes Design, schmerzhaft, schwer zu bedienen und ineffizient. Tun Sie das Richtige und weisen Sie allen Ihren Entitäten eine automatisch generierte einspaltige ID zu.
JB Nizet
@JB_Nizet Es macht mir nichts aus, einer Entität eine ID-Spalte hinzuzufügen. Aber muss ich auch eine Spalte in die Tabelle einfügen? Ich meine Orakel-Datenbank.
Vikiiii
Ja natürlich. Wo würde Hibernate die ID der Entität speichern, wenn die entsprechende Spalte nicht vorhanden ist?
JB Nizet
Ich fragte meinen Teamleiter. Ich kann die Spalte nicht hinzufügen. Ich muss sie zusammengesetzte Schlüssel machen. Ich habe versucht, @ EmbeddedId und @ Embeddable zu verwenden. Aber ich bekomme eine Ausnahme im Winterschlaf
Vikiiii
6

Es gibt viele Antworten und alle sind auch richtig. Aber 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 andere Tabelle B mit Spalte 2, die auf Spalte 1 verweist:

@ManyToOne
@JoinColumn(name = "TableBColumn", referencedColumnName = "TableAColumn")
private TableA session_UserName;

Geben Sie hier die Bildbeschreibung ein

@ManyToOne
@JoinColumn(name = "bok_aut_id", referencedColumnName = "aut_id")
private Author bok_aut_id;
Vaibhav Jain
quelle
2

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

Shivam Sugandhi
quelle