Hibernate One-To-many-Unidirektional auf eine vorhandene DB
Stack Overflow Hallo Experten, ich brauche Eure expertice:
Ich versuche, mit Hibernate auf eine Vorhandene DB.
Derzeit im Versuch zum laden eines User-Objekts und eine Liste der UserData-Objekte, die entlang gehen.
in der DB die (vereinfachte) layout
| User | | UserData |
---------------- -----------------------------------
uid | username | | uid | parentuid | field | value |
So dass jeder Benutzer-Objekt entspricht allen UserData-Objekte, wo UserData.parentuid = User.uid.
Meiner User-Klasse mapping-Datei
<class name="com.agetor.commons.security.User" table="ac_users">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/>-->
</id>
<property name="username" column="username" />
<list name="fieldData" cascade="all">
<key column="parentuid" not-null="true" />
<index column="parentuid" />
<one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
</class>
Mu UserData mapping-Datei
<class name="com.agetor.commons.fields.FieldData" table="ac_userdef_data">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/> -->
</id>
<!--<property name="parentuid" column="parentuid" /> -->
<property name="fieldname" column="fieldname" />
<property name="value" column="value" />
</class>
Bisher habe ich versucht, viele verschiedene Konfigurationen und alle von Ihnen haben verschiedene Grade der failue. Der code hier eingefügt, funktioniert nicht.
- Die parentuid Eigenschaft ist auskommentiert, weil Hibernate gibt eine "Wiederholte Spalte mapping" Fehler sonst.
- Momentan ist es noch eine "Wiederholte Spalte "Zuordnung" auf das uid-Feld, die ich für
<list-index />
- Verstehe ich nicht, wo ich festlegen, dass der UserData.parentuid ist der fremde Schlüssel, und dass die Liste verwenden sollten Benutzer.uid als Schlüssel.
Ich hoffe jemand ist in der Lage zu helfen.
Wenn Sie definieren sowohl eine Eins-Zu-Viele und Viele-Zu-Eins, bedeutet dies nicht machen es Bi-Direktional?
Das aktuelle Modell ist Unidirektional und UserData keinen Bezug zum Benutzer. Ihre Anmeldung fehlschlägt, weil der Ruhezustand nicht finden konnten, einen get-oder set-Methode für den Benutzer auf UserData.
Ist es impliziert, dass dieser code verwendet den Benutzer.uid als Schlüssel und gleicht diese gegen die UserData.parentuid Spalte? Oder ist diese Tatsache angegeben woanders?
<list name="fieldData" inverse="true">
<key column="parentuid" not-null="true" />
<one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
Ich bin immer noch lernen, Hibernate und arbeitet mein Weg durch die Dokumentation und die Beispiele, die ich finden kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese (drycode):
Wenn es funktioniert, versuchen Sie, die index-und cascade-Sachen, die ich ausgelassen habe.
Jubel
mitch
Ich denke, Sie sind nah, aber die Liste ist wahrscheinlich nicht die Struktur der Daten, die Sie wollen in Ihre neue Klasse Benutzer. Eine Liste impliziert die Reihenfolge der untergeordneten Elemente, die die Tabellen nicht zu haben scheinen. Wenn Sie eine indizierte Kollektion wie eine Liste, die Daten auf eine separate Spalte enthält den index, also die "wiederholte Spalte mapping" - Problem.
Die Regeln der Daumen, die ich verwende sind - jeder Kartierung sollte auch ein Eintrag für jedes Mitglied der Klasse ist das mapping. So zum Beispiel Ihre Benutzer-Klasse sollte einen Eintrag für seine Sammlung von FieldData, aber Ihre FieldData Zuordnung nicht benötigen, einen Eintrag für parentuid, da diese Spalte nicht anzeigen auf ein element der FieldData-Klasse - es geht nur um die FieldData in der Sammlung, in der das übergeordnete Objekt.
Wenn das User-Objekt wirklich enthalten eine geordnete Sammlung von FieldData, dann mit einem Satz statt. Auf der anderen Seite, ich denke, es ist mehr wahrscheinlich, dass Sie würde wollen, dass eine Karte von FieldData statt, mit dem 'Feld' name als der index. Dann die FieldData-Klasse nicht brauchen, um die Karte der 'Feld' - Spalte und nicht als Mitglied, es werde nur noch den Wert (und andere Felder aus dieser Tabelle - natürlich, wenn es wirklich nur um eine Spalte nach Links zuordnen, Sie können nur am Ende mit einer Karte von Streicher zu Streicher.
Dies ist die neueste Entwicklung auf dieses problem. Diese Konfiguration kann erfolgreich laden aus der Datenbank. Das speichern funktioniert nicht.
Ich habe beschlossen das zu ändern und den Datenbank-design statt, so dass ich dieses posting hier zur Referenz für andere, bevor ich es aufgeben, dieser Ansatz.
-->
Versuchen, diese , ich gerade geändert-key-Spalte als parentuid uid.(Und besser verwenden, legen Sie in der hibernate-mappings)
cheers,
Nagendra Prasad..