# Hibernate - Problem bei Mapping



## y0dA (5. Mrz 2008)

Hi!
Also ich habe 2 Tabellen:

```
Client
Personal_Name
```
Nun ist es so dass Client einen FK von Personal_Name hat und es hierbei auch nur einen Personal_Name zu einem Client geben kann.

Wie realisiere ich hierbei das Mapping?

Habe es wie folgt versucht (jedoch wird dann beim speichern eines Client Objektes der FK zu Personal_Name nicht gesetzt!):


```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
	package="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web">
	<class name="Client" table="CLIENT">
		
		<id name="id" type="integer" column="CL_ID">
			<generator class="increment" />
		</id>
		<many-to-one name="contactDetail"
			class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.locating.ContactDetail"
			column="CL_CD_ID" lazy="false" />
		<many-to-one name="organisation"
			class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.locating.Organisation"
			column="CL_O_ID" lazy="false" />
		<one-to-one name="personalName"
			class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web.PersonalName"
			lazy="false">
		</one-to-one>
	</class>
</hibernate-mapping>
```


```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
	package="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web">
	<class name="PersonalName" table="PERSONAL_NAME">
		
		<id name="id" type="integer" column="PN_ID">
			<generator class="increment" />
		</id>
		<property name="forename" type="string" column="PN_FORENAME" />
		<property name="surname" type="string" column="PN_SURNAME" />
	</class>
</hibernate-mapping>
```


----------



## SlaterB (5. Mrz 2008)

schreib noch cascade="all" dazu,
oder irgendeines der cascades, suche danach


----------



## y0dA (5. Mrz 2008)

```
cascade="all"
```
Bringt keine Änderung!!

Kann es sein dass

```
<one-to-one name="personalName" 
         class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web.PersonalName" 
         lazy="false">
```
Falsch ist?

Also mit folgendem funktioniert es, nur ist das dann keine 1:1 Beziehung?!

```
<many-to-one name="personalName" class="PersonalName"
			column="CL_PN_ID" lazy="false" />
```

Also um zut DB zurückzukommen, die Tabelle Client besitzt den FK der Tabelle Personal_Name. Personal_Name weiß nichts von Client!

Welche Variante ist nun richtig?


----------



## byte (5. Mrz 2008)

Du musst bei OneToOne natürlich auch angeben, über welche Spalten der Join passieren soll. Wenn das jeweils über den PK passieren soll, gehts mit @PrimaryKeyJoinColumn. Ansonsten musst Du halt die @JoinColumn angeben, also den FK. KA wie das genau in der XML heisst, nutze nur Annotations. Das steht sonst aber auch in der Hibernate Doku beschrieben.

PS: Mit Cascade.ALL wäre ich eher vorsichtig. Da können schnell mal zuviele Daten gelöscht werden.


----------



## y0dA (5. Mrz 2008)

byto hat gesagt.:
			
		

> Du musst bei OneToOne natürlich auch angeben, über welche Spalten der Join passieren soll. Wenn das jeweils über den PK passieren soll, gehts mit @PrimaryKeyJoinColumn. Ansonsten musst Du halt die @JoinColumn angeben, also den FK. KA wie das genau in der XML heisst, nutze nur Annotations. Das steht sonst aber auch in der Hibernate Doku beschrieben.
> 
> PS: Mit Cascade.ALL wäre ich eher vorsichtig. Da können schnell mal zuviele Daten gelöscht werden.



Denke du meinst?

```
<one-to-one name="personalName"
			class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web.PersonalName"
			lazy="false" cascade="all" foreign-key="CL_PN_ID" />
```

Damit geht es, nur wenn ich nun einen Datensatz des Typs Client löschen möchte, muss ich auch aus der Personal_Name Tabelle den Wert löschen? Welches cascade würde passen (save-update-delete --> gibts das?)


----------



## byte (5. Mrz 2008)

Es gibt ein entsprechendes Remove Cascade. Musst Du mal in die Doku schauen, wie das genau für die XML heisst. Die Begriffe sind bei den Annotations etwas anders als in der XML. Du kannst dann aber eigtl auch direkt Cascade all nehmen.


----------



## y0dA (5. Mrz 2008)

Ok, danke.

Naja leider wird mit:

```
<one-to-one name="personalName" 
         class="org.pcd.wam.gegenstandsbereich.tmcHibernate.model.web.PersonalName" 
         lazy="false" cascade="all" foreign-key="CL_PN_ID" />
```
Leider doch nicht der Fremdschlüssel mitgespeichert wenn ich einen Client speichere.


----------



## byte (5. Mrz 2008)

http://www.hibernate.org/hib_docs/v3/reference/en/html/mapping.html#mapping-declaration-onetoone


----------

