horstbrack wrote:
Hallo,
vielen Dank für Deine Antwort, aber leider passt das so nicht. Die Adresse Klasse hat ja eigentlich überhaupt keine Verbindung zur Elternklasse Person.
Ich habe mal einen Screenshot von der View gemacht, schaut doch bitte mal drauf, eigentlich kann das nicht so schwer sein. (Dies ist das real-world Modell, da ist Person = Einrichtung)
http://www.dumann.de/HibernateProblem.jpg<class name="de.hannit.fsch.Adresse" table="Adresse">
...
<one-to-one
name="person"
class="de.hannit.fsch.Person"
property-ref="adresse"/>
</class>
Es gibt zwei Möglichkeiten für eine one-to-one Assoziation:
1. foreign key association
2. primary key association
Was Du als erstes versucht hast, war die primary key association. Dabei hat die zu Person gehörige Adresse immer den selben Primary Key wie die Person und kann so gefunden werden.
Nachteil: keine DB Konsistenzüberprüfung. Außerdem kann Person dann nur genau eine Adresse haben. Nicht irgendwann zwei, z.B. Home und Work.
Bei der ersten Möglichkeit (foreign-key association) ist Personen.adresseID ein foreign key auf Adressen.id. Um auszuschließen, dass zwei Personen auf dieselbe Adresse zeigen, musst Du der DB sagen, dass Personen.adresseID unique ist.
Das kannst Du auch im Mapping-File unterbringen, wird aber IMHO nur benötigt, falls Du aus den Mappings die create-tables machen willst (hbm2dll).
Außerdem definierst Du im Mapping tatsächlich eine many-to-one Beziehung, weil das für Hibernate keinen Unterschied macht.
Das sähe dann so aus wie Holger beschrieben hat (um unique ergänzt):
<class name="de.hannit.fsch.Person" table="Personen">
...
<many-to-one
name="adresse"
class="de.hannit.fsch.Adresse"
column="adresseID"
cascade="all"
<!-- unique und type werden IMHO nur für hbm2dll benötigt -->
unique="true"
type="int"/>
...
Das von Holger erwähnte one-to-one Element im Adresse-Mapping kannst Du weglassen, wenn Du nicht von Adresse zu Person navigieren möchtest.
Gruß
Sebastian