-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Hibernate Grundlagen
PostPosted: Mon Jan 25, 2010 5:23 am 
Newbie

Joined: Tue Jan 19, 2010 5:13 am
Posts: 4
Hallo,
ich bin Anfänger in Bezug auf Hibernate.
Beim Lesen der vielen Beispiele fällt mir auf, dass oftmals meine Probleme nicht im Zusammenhang mit Hibernate, sondern im
Desingn der Tabellen liegen.

Nach meinem Verständnis sollte es doc Ziel sein, Tabellen ohne NULL Werte zu erzeugen.

Simples Beispiel eine 1:1 Beziehung.
Mein Standardbeispiel : Jeder Beamte hat einen Schreibtisch.

Wenn ich das auf Tabellen abbilde, so muss ich doch folgende Fälle betrachten:
A) jeder Beamte hat einen Schreibtisch und es gibt genausoviele Schreibtische wie es Beamte gibt:
Wenn das der Fall ist, kann ich eine Tabelle (Entität) erzeugen (Hibernate Embedded)

B) Es gibt mehr Schreibtische als Beamte, kein Beamter ohne Schreibtisch
Dann 2 Tabellen und in der Tabelle Beamte eine Zusatzspate TischID (Fremdschlüssel auf Tische)

C) Es gibt mehr Beamte (Praktikanten) als Schreibtische
Dann analog 2 Tabellen und in der Tabelle Tische den Fremdschlüssel BeamtenID

D) Es gibt mehr Tische als Beamte, aber es gibt Beamte die haben keinen Schreibtisch.
Dann 3 Tabellen Beamte, Tisch und in der 3.Tabelle die Fremdschlüssel BeamtenID und TischID


Wie gesagt ich rede von 1:1 (es gibt keine Beamten die 2 oder mehr Schreibtische haben und keine Schreibtische die mehr als
einem Beamten gehören)

Dies kann man auch für 1:N und M:N beschreiben

Jetzt sollte es doch mit Hibernate einen Weg geben, diese Fälle gezielt umzusetzen, oder bin ich völlig daneben ?
Gibt es irgendwo eine Dokumentation die beschreibt - 1:1 Fall a) ...... ?

Diese Beispiele sind alle unidirektional.
Jetz gibt es Beispiele die bidirektional sind.
Meine Frage : Warum sollte ich das machen ? Warum sollte ich bewusst NULL Werte erzeugen ? Performance ?


mfg. Roland


Top
 Profile  
 
 Post subject: Re: Hibernate Grundlagen
PostPosted: Tue Jan 26, 2010 2:54 am 
Senior
Senior

Joined: Tue Oct 28, 2008 10:39 am
Posts: 196
Der Fall Mitarbeiter und Schreibtisch ist mMn ein Fall für M:N. Warum? Es könnte sein, dass der Mitarbeiter wirklich mehr als einen Schreibtisch hat, wenn er in mehr als einer Abteilung sitzt und für verschiedene Bereiche zuständig ist (gibts hier bei uns). Außerdem kann ein Schreibtisch mehr als einem Mitarbeiter zugeordnet sein, zum Beispiel zwei Halbtagskräften (auch das gibts hier). Es kann aber auch sein, dass einer gar keinen Schreibtisch hat, weil er lange krank geschrieben ist und der Schreibtisch solange an eine Vertretung vergeben ist.

Du solltest nicht bewusst NULL Werte erzeugen, ebenso wenig solltest du alles mögliche als M:N abbilden. Musst eben wirklich deine Anforderungen prüfen und kritisch hinterfragen, wenn dir einer erzählt, dass ein Schreibtisch zu keiner oder einer Person gehört oder jemand immer einen Schreibtisch hat. Wer ist der "Besitzer" einer Beziehung? Wie sieht die Beziehung wirklich aus? Wie du letztendlich die Beziehung in deinen Klassen wiederfindest, ist eine andere Frage. Du kann eine Beziehung bidirektional machen, musst es aber nicht. Wenn du die Frage "Wem gehört dieser Schreibtisch?" nicht stellen brauchst, müsste die Beziehung nicht bidirektional sein. (Muss sie auch nicht sein, wenn du die Frage stellen müsstest, denn du kannst immernoch mit einer gezielten Abfrage herausfinden, wem der Schreibtisch zugeordnet ist.)

Für eigentlich alle gängigen Mappings gibts in der Hibernate Doku Beispiele. Wenn du an einem tieferen Einstieg interessiert bist, lies dir Java Persistence with Hibernate durch (wie die deutsche Ausgabe ist, kann ich dir leider nicht sagen).


Top
 Profile  
 
 Post subject: Re: Hibernate Grundlagen
PostPosted: Tue Jan 26, 2010 10:33 am 
Newbie

Joined: Tue Jan 19, 2010 5:13 am
Posts: 4
Hallo,

vielen Dank für Deine Antwort.

Ich habe aber ein Verständnisproblem.
Wenn man die Beziehungen zwischen 2 Entitäten analysiert und man kommt zu dem Schluss, dass es eine 1:1 Beziehung ist, dann treffen doch die von mit gemachten Aussagen (a-h) zu.
Wenn wie du schreibst, es Mitarbeiter gibt, die sich einen Schreibtisch teilen .. usw.
dann ist die Aussage 1:1 ja falsch und dann hat die Implementierung anders zu erfolgen.
Da wir aber nur Ausschnitte der wirklichen Welt abbilden, muss ich, wenn ich 1:1 analysiert habe, natürlich die Konsequenzen tragen, wenn sich herausstellt die Beziehengen sind 1:N oder M:N.
Wenn ich aber für meine Welt 1:1 zwischen diesen Entitäten analysiert habe, muss es doch möglich sein einen Weg zu beschreiben, wie dies mit Hibernate umzusezen ist.
Viele Beispiele die ich gefunden habe, sind mehr aus der Sicht "Was kann Hibernate alles".
Das Motto scheint zu sein : Ich habe eine Nadel, einen Faden und einen Knopf.
Ich kann den Knopf an die Hose, and Jacke nähen, aber ich kann auch den Knopf an die Backe nähen.
Ich werde diesbezüglich Deinen Literaturtipp befolgen.

Zum Stichwort : bidirektional
Gibt es irgendeinen vernünftigen Grund sowas zu implementieren. Nach meinem bisherigen Verständnis brauche ich das nicht, da ich alle Aussagen auch mit unidirektionalen Beziehungen lösen kann. (Auch durch Einsatzes von Views).

mfg. Roland


Top
 Profile  
 
 Post subject: Re: Hibernate Grundlagen
PostPosted: Wed Jan 27, 2010 4:26 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Fuer 1:1 bidirektional verwende @OneToOne Annotation
Fuer 1:1 unidirektional verwende @ManyToOne Annotation

Bidirektionale assoziationen haben Sinn:
sie ermoeglichen von beiden Seiten aus zur jeweils anderen zu navigieren (z.B. a.getAllB() und b.getA())

Dabei sei bemerkt, dass man dazu nicht unbedingt mehr Redundanz auf der db erzeugt:
Beispiel 1:n beziehung mit Verwendung von @OneToMany(mappedBy = ...)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.