# Hibernate n:m + Zwischentabellenfeld



## casi91 (7. Dez 2011)

Hallo Communitiy.

Wie man eine n:m Verbindung mittels einer Zwischentabelle abbildet ist mir mittlerweile klar.

Nun habe ich Folgendes Problem:
Ein Auftrag kann einen oder mehrere Status haben.
Ein Status kann zu einem oder mehreren Aufträgen gehören

(n:m), soweit kein Problem, ich erstelle eine Zwischentabelle AuftragStatus und bin glücklich.
Dies Bilde ich mittels Hibernate Annotations folgendermaßen ab:

```
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(name="AUFTRAGSTATUS", joinColumns = {
			@JoinColumn(name="AUFTRAGID") }, inverseJoinColumns = {
			@JoinColumn(name="STATUSID") } )
```

Nun möchte ich aber in meiner Zwischentabelle noch ein Feld "erfasstAm" haben, um ein kleine History zu haben, wann sich der Status geändert hat.

Ich hab derzeit keine Idee, wie ich das nun mittels Hibernate abbilden soll.
Danke schonmal im vorraus


----------



## casi91 (7. Dez 2011)

niemand eine Idee?
Oder ist das Problem nicht verständlich beschrieben?


----------



## casi91 (9. Dez 2011)

nach wie vor keine einer Idee?
..dann muss ichs wohl irgendwie ausprogrammieren ^.^


----------



## maki (9. Dez 2011)

Dann hättest du keine m:n Beziehung mehr, und das ist gut so 

Ein Auftrag hätte dann mehrere Status*zuweisungen* (neue Entität), die das Datum enthalten, die Autrag ID und die Status ID.
Jede Statuszuweisung gehört zu genau einem Auftrag.


----------



## casi91 (9. Dez 2011)

Danke für die Antwort
Das ich dann im Datenbankdesign keine n:m Beziehung mehr habe ist mir Bewusst ;-)
Um das zu verhindern mache ich ja die Zwischentabelle 

Ich glaube mein Problem ist nicht ganz durchgedrungen.
Hier nochmal ein Versuch:

Hibernate gibt mir ja die möglichkeit, dieses Konstrukt:
STATUS 1---->n AUFTRAGSTATUS n<----1 AUFTRAG

so zu definieren:

```
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(name="AUFTRAGSTATUS", joinColumns = {
            @JoinColumn(name="AUFTRAGID") }, inverseJoinColumns = {
            @JoinColumn(name="STATUSID") } )
```

Durch die Zuweisen brauche ich für die Zwischen-(oder Zuweisungs-)tabelle keine extra Java Klasse mit Annotations zu machen.

Um NUR die zuweisung zu machen, würde das ja auch reichen und die Zwischentabelle würde nur 2 Felder beinhalten:
-STATUSID
-AUFTRAGID

Nun möchte ich aber das die Zwischentabelle noch um ein Feld "ERFASSTAM" erweitert wird.
In diesem Feld will ich mich schlicht und ergreifend merken, wann der Auftrag den Status erreicht hat.

Nur hab ich derzeit keine Idee, wie ich das nun (möglichst ohne Java Klasse mit Annotations für die Zwischentabelle anzulegen) abbilden kann.
Also mein Problem ist nicht das DB-Design. Sondern wie ich das Datum noch in die Tabelle mitspeichere.

Hoffe das Problem ist deutlicher geworden =)


----------



## maki (9. Dez 2011)

Ich hab dein Problem schon verstanden, leider du meine Antwort nicht 

Du brauchst eine neue Entity und hast dann kein m:n mehr.


----------



## casi91 (9. Dez 2011)

Hmm entweder reden wir gerade aneinander vorbei, oder ich steh echt tierisch aufm schlauch :autsch:

Also die Entity "AUFWANDSTATUS" hab ich ja schon.
Sonst könnte ich das ganze über Hibernate auch nicht so abbilden.

Oder darf ich deine Aussage so verstehen, dass ich definitiv für die Entity auch eine eigene Javaklasse brauch?

Sorry wenn ichs grad nicht verstehe, aber es geht aufs Wochenende zu, da macht mein Hirn gern früher Feierabend


----------



## maki (11. Dez 2011)

Hi, was sonnst sollte eine Entity sein ausser einer Javaklasse?

Wie würdest du denn auf das Feld "erfasstAm" zugreifen wollen?

Könnte jetzt meine Aussagen nochmals wiederholen, ist aber überflüssig.


----------



## casi91 (11. Dez 2011)

Wenn ich von einer Entity rede, rede ich erst mal von der DB-Tabelle an sich. 
Aber dann weiß ich jetzt ja wie du es meinst.

Und wie ich darauf zugreifen kann, war ja mehr oderminder meiner frage. Da ich wissen wollte ob ich eine neue klasse brauch oder es auch über die many-to-many annotation die ich gepostet habe machen kann.
(falls es noch nicht bemerkt würde, in java und hibernate bin ich anfänger)

und sorry, aber dein letzter satz war überflüssig...

aber ma will sich ja net streiten.
danke für die antwort.


----------

