# hibernate: Problem mit OneToMany



## GilbertGrape (1. Jul 2008)

Hallo,

ich habe gerade damit angefangen, mit Hibernate rumzuspielen. Ich hab auch schon in den Tutorials gelesen.
Irgendwas haut aber mit meinen Beziehungen nicht hin. 
Zuerst mal die Situation. Ich möchte 2 Tabellen haben: Player und Team. Diese sollen über eine n-1 Beziehung miteinander verknüpft sein. Heißt also, ich trage das Team als Foreign Key in die Player ein.

Mit Hibernate sieht das bei mir im Moment so aus:

Team:

```
@Entity
@Table(name="TEAM")
public class Team implements Serializable{

	@Column @Id
	private String country;
	
	private Set<Player> players = new HashSet<Player>();
	
       private Team(){}	
	public Team(String country){
		this.country = country;
	}
	
	
	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}
	
	[b]@OneToMany(mappedBy = "team", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
	@JoinColumn(name = "team")[/b]
	public Set<Player> getPlayers(){
		return players;
	}
	
	public void setPlayers(Set<Player> players){
		this.players = players;
	}
```

Player:

```
@Entity
@Table (name="PLAYER")
public class Player implements Serializable {

	private Long Id;
	private String firstName;
	private String lastName;	
	private Team team;
	
	[b]@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
	@JoinColumn(name="country")[/b]
	public Team getTeam() {
		return team;
	}
	public void setTeam(Team team) {
		this.team = team;
	}
	//	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
	public Long getId() {
		return Id;
	}	
	private void setId(Long id) {
		Id = id;
	}
	//restliche getter und setter
}
```

Wenn ich jetzt in meine main-Methode ein Team hinzufügen will und die Session starte, kommt folgender Fehler:


```
org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: TEAM, for columns: [org.hibernate.mapping.Column(players)]
```

In der hibernate.cfg.xml stehen nur die Verbindungsdaten und das zu mappende Package und die beiden Klassen.

Ich hoffe, es ist nicht zu unübersichtlich und ihr könnt mir einen Tipp geben.

Gruß, Gilbert


----------



## Guest (5. Jul 2008)

@JoinColumn(name = "team") gehört in die Klasse Player.
Schreibe die Annotationen an die Attribute der Klasse, nicht an die Methoden. Das ist übersichtlicher.


----------



## Guest (5. Jul 2008)

Ungefähr so
	
	
	
	





```
@Entity
public class Team
{
   @Id
   private String country;

   @OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
   private Set<Player> players = new HashSet<Player>();

   ...
}

@Entity
public class Player
{
   @Id 
   @GeneratedValue
   private Long id;
   @Column
   private String firstName;
   @Column
   private String lastName;
   @ManyToOne
   @JoinColumn(name="team")
   private Team team;

   ...
}
```


----------



## GilbertGrape (7. Jul 2008)

Vielen Dank! Es hat jetzt geklappt.
Über die Frage, wohin die Annotations gehören, scheiden sich ja anscheinend die Geister. Die einen sagen, direkt an die Attribute, die anderen sagen, an die getter-Methode...


----------



## -MacNuke- (8. Jul 2008)

Also laut Buch ändert sich damit auch das Verhalten, wenn du die Annotations an die Attribute schreibst. Dann nutzt er afaik die Getter/Setter Methoden nicht, sondern direkt die Felder. Also da muss man afaik aufpassen.


----------

