# Beziehungsfrage Datenbanken



## mavinatic (20. Jul 2012)

Hallo Community,

ich bin immernoch an meinem JEE Trainingsprojekt. Zwar geht es hier mal wieder um die Beziehung zwischen beiden Objekten. Und die Hibernate Annotation.

Ich habe eine Klasse User, welches die Member-Variable "role" besitzt.

1x [USER] ---besitzt----> 1x [ROLE]
Die Annotation die bei der User-Klasse sein müsste ist doch @OneToMany(class=Role.class). Aber welche Annotation kommt auf der anderen Seite hin bei der Klasse Role?

Ein User besitzt eine Rolle, jedoch kann eine Rolle von einem anderen Benutzer auch benutzt werden.

Gruß


----------



## JimPanse (20. Jul 2012)

mavinatic hat gesagt.:


> Ein User besitzt eine Rolle




```
public class User{

@ManyToOne
Role role;

}
```

@OneToMany für eins-zu-viele Beziehungen d.h.

@OneToMany
List<Role> roles:



mavinatic hat gesagt.:


> jedoch kann eine Rolle von einem anderen Benutzer auch benutzt werden.




```
public class Role{
@ManyToMany
List<User>users;
}
```


----------



## nillehammer (20. Jul 2012)

Erstmal wäre die Frage, ob auf Objektebene die Rolle überhaupt die User kennen muss, denen sie zugewiesen ist. Es ist normalerweise nicht nötig, das in den Entities zu mappen. Wenn man alle User mit bestimmter Rolle wissen will, kann man sich eine entsprechende Query schreiben und über eine DAO-Methode zur Verfügung stellen.

Davon mal ab ist JimPanse's Mapping aber nicht korrekt. 
	
	
	
	





```
@ManyToMany
```
 wird bei m:n-Beziehungen benutzt. Wir haben hier aber eine *1:n*-Beziehung. Für diese wird die Paarung @OneToMany/@ManyToOne benutzt. Der korrekte Code für Role wäre also:

```
public class Role{
@OneToMany
List<User>users;
}
```
Für weitergehende Infos zum Mapping von Collections mit JPA siehe z.B. hier: Chapter*2.*Mapping Entities

P.S. Und noch ein paar Anmerkungen zum Code:
- Variablen besser private machen und setter/getter dafür schreiben
- Ist List wirklich nötig? Hat zwei Nachteile: Es muss eine Spalte für den Listindex mitgeschleift werden und List verhindert keine Doppelungen, also evtl besser Set
- Es gibt lange Diskussionen, ob man die Annotationen besser auf Variablen oder Gettern macht. Ich finde Getter besser, weil diese ggf in Subklassen überschrieben und um weiter Annotationen ergänzt werden können. Kein Musss, aber kannst ja mal drüber nachdenken.


----------



## JimPanse (20. Jul 2012)

JimPanse hat gesagt.:


> ```
> public class User{
> @ManyToOne
> Role role;
> ...



Man möge mir verzeihen, hatte mich verschrieben, sollte : 


```
public class Role{
@OneToMany
List<User>users;
}
```

sein bzw.  wäre @OneToMany(mappedBy="role") korrekt.


----------



## nillehammer (20. Jul 2012)

JimPanse hat gesagt.:
			
		

> Man möge mir verzeihen, hatte mich verschrieben, sollte : [...]


Kein Prob. Danke, dass Du nicht Deinen Originalpost verändert hast, sonst hätte meiner irgendwie ziemlich doof ausgesehen 


			
				JimPanse hat gesagt.:
			
		

> sein bzw. wäre @OneToMany(mappedBy="role") korrekt.


Da möge man *mir* jetzt verzeihen. Ohne das "mappedBy" geht es zwar auch, aber so ist es (aus mehreren Gründen) auf jeden Fall besser.


----------



## mavinatic (20. Jul 2012)

Es ist unidirektional d.h. Roles kennt die User nicht!


----------

