Wenn Sie eine unidirektionale Eins-zu-Viele-Verwendung in Ihrer Entitätsbeziehung wünschen.
Versuchen Sie es mit .. JoinTable
Ich habe einige Probleme mit der Vererbung. Hier meine Datenbankstruktur:
und zugehörige Entitäten:
Wenn ich versuche, User
zu speichern oder zu löschen, erhalte ich eine Ausnahme:
und:
%Vor% Hibernate versucht, eine Tabelle zu erstellen: user_question
und user_answer
, die ich brauche nicht.
Was sollte ich für Korrekturen tun?
Ich denke nicht, dass Sie dies erreichen können, indem Sie die Zuordnung ManyToOne
zu User
generisch in der Entität UserActivity
zuordnen. Das ist wahrscheinlich zu verwirrend für den JPA-Provider (Hibernate).
Stattdessen müssen Sie meiner Meinung nach die Zuordnung zu User
in jeder der Entitäten Question
, Answer
und Comment
zuordnen. Ja, ich weiß, dass es sich um duplizierten Code handeln würde, aber es sieht so aus, als ob Sie die OneToMany
-Mappings in User
dann mit der mappedBy
-Referenz qualifizieren können.
Zum Beispiel würde Ihre Entität Question
eine Assoziation haben, die wie folgt definiert ist:
Je nachdem, wie clever (oder nicht) Hibernate über die obige Verknüpfung funktioniert, müssen Sie möglicherweise table="USER_ACTIVITY"
in der JoinColumn
-Anmerkung angeben.
Dann würde die User
die OneToMany als:
Ähnlich für jedes von Answer
und Comment
.
Natürlich habe ich das nicht versucht, also könnte ich mich irren.
Wahrscheinlich geschieht das, weil der Ruhezustand beim Erstellen des @ OneToMany-Mappings eine Hilfstabelle erstellt, in der die ID aus den Entitäten der Beziehung gespeichert wird.
In diesem Fall sollten Sie Folgendes versuchen:
%Vor%Die Annotation @JoinColumn bildet die Beziehung ohne die Erstellung der Hilfstabelle ab, daher ist es wahrscheinlich, dass diese Lösung Ihnen in dieser Situation helfen wird.
Probieren Sie dieses Mapping aus, das sollte wie erwartet nach Abschnitt 2.2 funktionieren .5.3.1.1 der Dokumentation :
%Vor%Der Grund, warum die Hilfsverknüpfung erstellt wird, ist, dass es für Hibernate nicht möglich ist, zu wissen, dass die Viele-Seite der Beziehung (z. B. Frage) einen Fremdschlüssel an Benutzer zurückgibt, der genau der gleichen Beziehung wie% entspricht. co_de%.
Die Assoziation User.questions
könnte eine völlig andere Assoziation sein, zum Beispiel Question.user
oder User.questionCreator
.
Wenn Sie User.previousSuccessfulAnswerer
betrachten, kann Hibernate nicht erkennen, dass es sich um die gleiche Verknüpfung wie Question.user
handelt.
Ohne dass User.questions
angibt, dass die Beziehung gleich ist, oder mappedBy
, um anzuzeigen, dass es keine Join-Tabelle gibt (sondern nur eine Join-Spalte), löst Hibernate die generische Eins-zu-Viele-Zuordnungslösung aus das besteht darin, eine Hilfszuordnungstabelle zu erstellen.
Das Schema vermisst solche Assoziationstabellen, was den Fehler verursacht, der mit der obigen Abbildung gelöst werden kann.
Ich habe einige Probleme mit der Vererbung. Hier meine Datenbankstruktur:
und zugehörige Entitäten:
Wenn ich versuche, %code% zu speichern oder zu löschen, erhalte ich eine Ausnahme:
%Vor%und:
%Vor%Hibernate versucht, eine Tabelle zu erstellen: %code% und %code% , die ich brauche nicht.
Was sollte ich für Korrekturen tun?
Wenn Sie eine unidirektionale Eins-zu-Viele-Verwendung in Ihrer Entitätsbeziehung wünschen.
Versuchen Sie es mit .. JoinTable
Ich denke nicht, dass Sie dies erreichen können, indem Sie die Zuordnung %code% zu %code% generisch in der Entität %code% zuordnen. Das ist wahrscheinlich zu verwirrend für den JPA-Provider (Hibernate).
Stattdessen müssen Sie meiner Meinung nach die Zuordnung zu %code% in jeder der Entitäten %code% , %code% und %code% zuordnen. Ja, ich weiß, dass es sich um duplizierten Code handeln würde, aber es sieht so aus, als ob Sie die %code% -Mappings in %code% dann mit der %code% -Referenz qualifizieren können.
Zum Beispiel würde Ihre Entität %code% eine Assoziation haben, die wie folgt definiert ist:
%Vor%Je nachdem, wie clever (oder nicht) Hibernate über die obige Verknüpfung funktioniert, müssen Sie möglicherweise %code% in der %code% -Anmerkung angeben.
Dann würde die %code% die OneToMany als:
haben %Vor%Ähnlich für jedes von %code% und %code% .
Natürlich habe ich das nicht versucht, also könnte ich mich irren.
Probieren Sie dieses Mapping aus, das sollte wie erwartet nach Abschnitt 2.2 funktionieren .5.3.1.1 der Dokumentation :
%Vor%Der Grund, warum die Hilfsverknüpfung erstellt wird, ist, dass es für Hibernate nicht möglich ist, zu wissen, dass die Viele-Seite der Beziehung (z. B. Frage) einen Fremdschlüssel an Benutzer zurückgibt, der genau der gleichen Beziehung wie% entspricht. co_de%.
Die Assoziation %code% könnte eine völlig andere Assoziation sein, zum Beispiel %code% oder %code% .
Wenn Sie %code% betrachten, kann Hibernate nicht erkennen, dass es sich um die gleiche Verknüpfung wie %code% handelt.
Ohne dass %code% angibt, dass die Beziehung gleich ist, oder %code% , um anzuzeigen, dass es keine Join-Tabelle gibt (sondern nur eine Join-Spalte), löst Hibernate die generische Eins-zu-Viele-Zuordnungslösung aus das besteht darin, eine Hilfszuordnungstabelle zu erstellen.
Das Schema vermisst solche Assoziationstabellen, was den Fehler verursacht, der mit der obigen Abbildung gelöst werden kann.
Wahrscheinlich geschieht das, weil der Ruhezustand beim Erstellen des @ OneToMany-Mappings eine Hilfstabelle erstellt, in der die ID aus den Entitäten der Beziehung gespeichert wird.
In diesem Fall sollten Sie Folgendes versuchen:
%Vor%Die Annotation @JoinColumn bildet die Beziehung ohne die Erstellung der Hilfstabelle ab, daher ist es wahrscheinlich, dass diese Lösung Ihnen in dieser Situation helfen wird.