many-to-many Relationships in Hibernate

Nach längerem Suchen habe ich endlich verstanden, wie man n:m-Beziehungen in Hibernate am besten mappt.
Für die Verwaltung von solchen Beziehungen benötigt man in relationalen Datenbanken eine Beziehungstabelle.

Nehmen wir an es gibt 3 Tabellen:

News, Category und NewsCategory.

Eine News kann mehreren Categories zugeordnet sein und die Categories können natürlich in verschiedenen News benutzt werden. NewsCategory ist somit die Relationship-Tabelle.

Folgende Felder sind definiert (Auszug):

  • News-Tabelle: newsId(PK)
  • Category-Tabelle: categoryId(PK)
  • NewsCategory-Tabelle: newsCategoryId(PK), newsId(FK), categoryId(FK)

In der news.hbm.xml-Mapping-Datei definiert man ein Set, das die Beziehung zu den Categories abbildet:

<set name=“categories“ table=“NewsCategory“>
<key column=“newsId“ />
<many-to-many class=“net.vland.demo.Category“ column=“categoryId“/>
</set>

Das gleiche in der category.hbm.xml

<set name=“news“ table=“NewsCategory“>
<key column=“categoryId“ />
<many-to-many class=“net.vland.demo.News“ column=“newsId“/>
</set>

Nun muss man nur noch in den POJOs einfache Sets mit den definierten Namen erzeugen und das war’s. Es ist jetzt möglich ohne Umwege über die Beziehungstabelle die Daten auszulesen, z.B.:

Set categories = news.getCategories();

Anmerkung: Hibernate wirft eine Exception, wenn für einen Datensatz kein „Beziehungs-Set“ da ist. Dies kann durch not-found=“ignore“ im <many-to-many>-Tag unterbunden werden.

Advertisements

  1. Hallo,
    danke für den Eintrag, genau das habe ich gerade gesucht.
    Aber ich habe zwei Fragen:
    In der Hibernate Dokumentation unter [1] finde ich „many-to-many“ nicht.
    Außerdem stellt sich mir noch die Frage, ob für key-column der Name aus der Beziehungstabelle (NewsCategory) oder aus der anderen verwendet werden muss.
    Danke.




Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s



%d Bloggern gefällt das: