# Hibernate 2 Foreign keys



## Freaky123 (25. Apr 2011)

Also ich hab einmal die Klasse:

```
public class User {

	private String name;
	private int id;
	private String username;
	private String password;

//Dazu noch getters und setters
```


```
public class Kasten {
	private String Kastenname;
	private int KastenID;
	private User user;
	
//Getters und setters
```
und die klasse:

```
public class Archiv {
	private Kasten kasten;
	private int f1;
	private int f2;
	private int archiv_ID;

//getters und setters
```
ich braechte jetzt ein hibernate file fuer den Zugriff auf die Datenbank, nur weis ich da nicht ganz wie ich die many-to-one bedingung zu schreiben habe da als foreign key im ARCHIV sowohl die KASTENID von der Klasse KASTEN als auch die BenutzerID von der Klasse USER enthalten sein soll:

```
create table archiv (
	archiv_id integer not null,
	f1 integer,
	f2 integer,
	KastenID integer not null,
	UserID integer not null,
	Primary Key(archiv_id),
	Foreign Key(KastenID, UserID) References Kasten(KastenID, UserID)
)
```

Bisher hab ich:
[XML]
<hibernate-mapping>

	<class name="files.Archiv" table="Archiv">
	<id name="archiv_ID" type="int">
		<generator class="increment" />
	</id>
		<many-to-one name="kasten" column="kastenid" class=files.Kasten" not-null="true" cascade="all" unique="true" />
		<property name="f1" type="int" />
		<property name="f2" type="int" />
    </class>
</hibernate-mapping>
[/XML]


----------



## SlaterB (26. Apr 2011)

die Konfigurationen der Fremdschlüssel funktioniert unabhängig voneinander,
funktioniert das zum Kasten schon? dann nur noch für das andere dasselbe?
welche exakten Probleme treten auf?


----------



## Freaky123 (26. Apr 2011)

Ja die fuer den Kasten funktioniert schon:
[XML]
<hibernate-mapping>
    <class name="files.Kasten" table="Kasten">
        <id name="KastenID" type="int" access="field">
            <generator class="increment" />
        </id>
        <many-to-one name="owner" column="userid" class="files.User" not-null="true" unique="true" cascade="all" />
        <property name="Kastenname" type="string" access="field" />
    </class>
</hibernate-mapping>
[/XML]

Sorry das bei Archiv sollte eigentlich eine one-to-one Beziehung sein also so:
[XML]
<hibernate-mapping>

	<class name="com.sample.files.Archiv" table="Archiv">
	<id name="archiv_ID" type="int">
		<generator class="increment" />
	</id>
		<one-to-one name="kasten" class="files.Kasten" cascade="all" />
		<property name="f1" type="int" />
		<property name="f2" type="int" />
    </class>
</hibernate-mapping>
[/XML]

Das die Konfiguration der beiden unabhaengig verlaeuft? Also dass ich im Archiv direkt auf den User mappe, weil in diesem Fall haengt der ja mit dem Kasten zusammen?


----------



## SlaterB (26. Apr 2011)

wenn die Tabelle Archiv in der DB einen Fremdschlüssel auf Kasten und einen auf User hat, kannst du in der Java-Klasse Archiv zwei entsprechende Attribute setzen,

warum Kasten auf User verlinkt sehe ich nicht, entscheidend dafür dürfte die entsprechene Datenbanktabelle sein,
mit den beiden Fremdschlüsseln von Archiv hat das aber logischerweise zunächst nichts zu tun,

wenn du diese auf verrückten Wege irgendwie zu dieser Verknüpfung Kasten <-> User nutzen willst, dann kann ich dazu nichts beitragen


----------



## Freaky123 (26. Apr 2011)

Die Klasse Kasten besitzt ja einen User und somit als Fremdschluessel userid:

```
public class Kasten {
    private String Kastenname;
    private int KastenID;
    private User user;
```

Nun hab ich das Archiv das als fremdschluessel einmal die KastenID hat und dann noch den User von kasten (fuer die UserID):


```
public class Archiv {
    private Kasten kasten;
    private int f1;
    private int f2;
    private int archiv_ID;
```

Jetzt beinhaltet "private Kasten kasten" in Archiv aber beide Fremdschluessel und da liegt das Problem wie ich die angeben soll...


----------



## SlaterB (26. Apr 2011)

mit 'x besitzt y' einfach so kann ich persönlich leider nichts anfangen

die Datenbank-Tabelle Archiv hat zwei Fremdschlüssel
 -> ergo kann die Java-Klasse Archiv "private Kasten kasten;" + "private User user;" enthalten

mehr Feststellungen gibt es aus meiner Sicht noch nicht


----------



## Freaky123 (26. Apr 2011)

Ja aber "private User user" waere ja redundant da der ja schon im "private Kasten kasten" drinnen ist?!?


----------



## SlaterB (26. Apr 2011)

wenn in der Datenbank Kasten auf User verweist dann ist Hibernate eben genauso redundant, kann ja nicht zaubern, 
bzw. muss nicht, diese Situation ist an sich eine denkbare die die Welt nicht zerstören wird,

was du stattdessen alles vorhast, wie alle Tabellen in der DB aussehen, welcher Datenbank-Fremdschlüssel über 5 Umwege in einer anderen Java-Klasse auftauchen soll (oder gerade nicht) usw. müsstest du alles lang und ausführlich erklären

oder ein anderer Weg: 
Vorschlag: entferne "UserID integer NOT NULL," in der Tabelle Archiv und die Verknüpfung in der Java-Klasse, schon ist die Redundanz weg,
jetzt anwortest du bestimmt "ja aber dann.. " und das ist eben eine der weiteren vielen vielen Erklärungen die du noch hinschreiben musst


----------



## Freaky123 (26. Apr 2011)

Vielen dank fuer die Hilfe ich versuch mal bischen was umzustellen


----------

