Hibernate - ManyToOne & Vererbung / JOINED / mappedBy

9

Ich habe einige Probleme mit der Vererbung. Hier meine Datenbankstruktur:

und zugehörige Entitäten:

AbstractEntity:

%Vor%

UserActiture-Entität:

%Vor%

Kommentarelement:

%Vor%

Fragenteil:

%Vor%

Antworteinheit:

%Vor%

und Benutzereinheit:

%Vor%

Problem:

Wenn ich versuche, User zu speichern oder zu löschen, erhalte ich eine Ausnahme:

%Vor%

und:

%Vor%

Hibernate versucht, eine Tabelle zu erstellen: user_question und user_answer , die ich brauche nicht.

Was sollte ich für Korrekturen tun?

    
Anton Dozortsev 07.03.2014, 13:57
quelle

4 Antworten

4

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:

%Vor%

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:

haben %Vor%

Ähnlich für jedes von Answer und Comment .

Natürlich habe ich das nicht versucht, also könnte ich mich irren.

    
DuncanKinnear 13.03.2014, 22:19
quelle
2

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.

    
N0nbot 07.03.2014 20:01
quelle
1

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.

    
Angular University 09.03.2014 21:32
quelle
0
___ qstnhdr ___ Hibernate - ManyToOne & Vererbung / JOINED / mappedBy ___ qstntxt ___

Ich habe einige Probleme mit der Vererbung. Hier meine Datenbankstruktur:

und zugehörige Entitäten:

AbstractEntity:

%Vor%

UserActiture-Entität:

%Vor%

Kommentarelement:

%Vor%

Fragenteil:

%Vor%

Antworteinheit:

%Vor%

und Benutzereinheit:

%Vor%

Problem:

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?

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ antwort22404976 ___

Wenn Sie eine unidirektionale Eins-zu-Viele-Verwendung in Ihrer Entitätsbeziehung wünschen.
Versuchen Sie es mit .. JoinTable

%Vor%     
___ answer22392204 ___

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.

    
___ tag123spring ___ Das Spring Framework ist ein Open-Source-Framework für die Anwendungsentwicklung auf der Java-Plattform. Im Mittelpunkt steht die umfassende Unterstützung von komponentenbasierten Architekturen, und es verfügt derzeit über ein Dutzend hochintegrierter Module. ___ tag123hibernate ___ Hibernate ist eine ORM-Bibliothek (Object-Relational Mapping) für die Sprache Java, die es Entwicklern ermöglicht, POJO-artige Domänenmodelle in ihren Anwendungen zu verwenden, die weit über das Object / Relational Mapping hinausgehen. ___ tag123maven ___ Apache Maven ist ein Build-Automation- und Projektmanagement-Tool, das hauptsächlich für Java-Projekte verwendet wird. Dieses Tag ist für Fragen gedacht, die sich nicht auf eine bestimmte Maven-Version beziehen. Verwenden Sie stattdessen den Gradle-Tag für Fragen zu Gradle. ___ answer22288444 ___

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.

    
___ answer22259623 ___

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.

    
___
Wundwin Born 14.03.2014 12:27
quelle

Tags und Links