-->
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.  [ 3 posts ] 
Author Message
 Post subject: Mapping problem bei 1:n Beziehung
PostPosted: Tue Dec 18, 2007 9:18 pm 
Newbie

Joined: Tue Dec 18, 2007 9:01 pm
Posts: 3
Hibernate version: 3
Mapping documents: Annotation Mapping (siehe Klasse)
Name and version of the database you are using: MySQL 5


Hallo zusammen!

Ich habe ein Problem mit dem Mapping von Hibernate bzw. damit wie Hibernate es umsetzt und anschließend benutzt.

Mein Problem:

Ich habe 2 Klassen: Bug und Benutzer
Ein Benutzer kann 0 bis n Bugs einreichen und ein Bug kann nur genau von einem Benutzer eingereicht werden.

Diesen Sachverhalt habe ich wie folgt dargestellt (habe hier für das Forum nur die relevanten Dinge herausgenommen):

Benutzer:
Code:
public class Benutzer implements Serializable {
...
@OneToMany(cascade = {CascadeType.ALL})
    private Set<Bug> bug = new HashSet<Bug>();
...
}


Bug:
Code:
public class Bug  implements Serializable {
...
@ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name="benutzerID")
    private Benutzer einreicher;
...
}


Nun meine Fragen:

1) Hibernate generiert beim erstellen der Datenbank richtiger Weise die zwei zugehörigen Tabellen, jedoch auch eine Art ZwischenTabelle wie bei n:m Beziehungen. Speichere ich nun einen Benutzer mit seinen Bugs ab (per Cascade, ich speichere nur den Benutzer per Befehl) füllt Hibernate aber nur die zwei "richtigen" Tabellen (Benutzer und Bug), nicht aber die ZwischenTabelle. Weiters kann ich, ohne die Beziehung in der Zwischentabelle manuell einzufügen, die Objekte nicht mehr laden.

2) Wie mappe ich eine solche Beziehung (sie is ja bidirektional?) mit richtigen Bezeichungen? Also zB mit Hilfe der mappedBy Klausel. (Die funktioniert bei mir des Öfteren nur bedingt)

Vielen Dank für eure Hilfe im Vorhinein!

lg
Mitschi


Top
 Profile  
 
 Post subject: Re: Mapping problem bei 1:n Beziehung
PostPosted: Wed Jan 02, 2008 1:33 pm 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Mitschi wrote:

Code:
public class Benutzer implements Serializable {
...
@OneToMany(cascade = {CascadeType.ALL})
    private Set<Bug> bug = new HashSet<Bug>();
...
}


Bug:
Code:
public class Bug  implements Serializable {
...
@ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name="benutzerID")
    private Benutzer einreicher;
...
}


(...)
Mitschi


Hallo Mitschi,

ich glaube, dein Problem rührt einfach daher, dass du auf der One-Seite vergessen hast, das "mappedBy" anzugeben:
Code:
@OneToMany(mappedBy = "einreicher" ...
.

Denn bei bidirektionalen Beziehungen muss Hibernate mitgeteilt werden, auf welcher Seite es erkannen soll, ob das Objekt und damit die Beziehung "dirty" ist.
PS: das "cascade" auf der many-Seite (für "einreicher") ist überflüssig!

Carlo


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 03, 2008 4:52 am 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hi Mitschi,

Vgl.
http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#entity-mapping-association-collections
2.2.5.3.2.2. Unidirectional

die JoinColumn (@JoinColumn(name="benutzerID")
ist nicht korrekt, da diese eigentlich keine Spalte sondern eine eigene Tabelle ist, da Sets durch eine separate Tabelle dargestellt werden, da "Repeating Groups" ein schlechtes DB-Schema wäre. In diesem Fall sollte sie auch eher beim Benutzer auftauchen.

Somit müsstest Du @JoinColumn(name="einreicher") verwenden, um diese Tabelle zu vermeiden und die Referenz über die Tabelle Bugs zu implementieren, da hier implizit eine 1:1-Beziehung vorliegt, die als foreign-key-Attribut pflegbar ist.


Übrigens sind solche Rückreferenzen Gift für den Garbage-Collector und sollten wenn möglich vermieden werden, indem man z.B. den Benutzer erst beim Methodenaufruf übergibt. Sollte ein Benutzer freigegeben werden, wird dieser für den GC ja noch durch die Bugs referenziert und kann nicht freigeben werden und umgekehrt. Zumindest erfordert dies explizites Beziehungsmangament und ist daher relativ fehleranfällig.

Nur wenn die Lebenszyklen der beiden Objekte nahezu identisch sind (direkt abhänig voneinander) ist eine solche Rückreferenz relativ unproblematisch.

Viele Grüße Michael


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.