# Annotation "ID: Primary Key über mehrere Spalten möglic



## Angel4585 (19. Jan 2008)

Hallo,

in der Schule hab ich gelernt, dass man einen Primary Key über mehrere Spalten machen kann. 
Geht das hier auch?

@Id kann ich ja eigentlich nur auf einen Wert machen.
Ich hab jetz aber ne Verknüpfungstabelle in die ich Werte aufnehmen will

Also so:

Tabelle: Personen
id
name


Tabelle: Benutzung
personenid
gegenstandid
anzahlbenutzungen


Tabelle: Gegenstand
id
name

wenn ich Benutzung als eigene Klasse mach muss ich ne ID angeben, aber ich kann die nich über die beiden id felder machen, möchte aber auch keine extra ID Spalte einfügen. Also wie mach ich das am Besten?


----------



## Guest (19. Jan 2008)

Verzichte auf das "anzahlbenutzungen" (kriegst du über die Grösse der Collections und/oder mit Named Queries heraus) 
und mache ein ManyToMany zwischen Person und Gegenstand.
z.B.
	
	
	
	





```
@Entity
class Person {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name="ID", updateable=false)
   private Long id;

   @ManyToMany
   @JoinTable( name = "GEGENSTAND_BENUTZUNG", 
      joinColumns = @JoinColumn( name = "PERSONID", referencedColumnName = "ID" ), 
      inverseJoinColumns = @JoinColumn( name = "GEGENSTANDID", referencedColumnName = "ID" )
   )
   private Set<Gegenstand> gegenstaende = new HashSet<Gegenstand>();

   ...
}

@Entity
class Gegenstand {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name="ID", updateable=false)
   private Long id;

   @ManyToMany
   @JoinTable( name = "GEGENSTAND_BENUTZUNG", 
      joinColumns = @JoinColumn( name = "GEGENSTANDID", referencedColumnName = "ID" ), 
      inverseJoinColumns = @JoinColumn( name = "PERSONID", referencedColumnName = "ID" )
   )
   private Set<Person> personen = new HashSet<Person>();

   ...
}
```


----------



## Angel4585 (19. Jan 2008)

ne das anzahlBenutzung sagt mir wie oft eine Person einen Gegenstand benutzt hat, darauf kann ich nicht verzichten.
Ausserdem sollen da noch mehr Werte rein.


----------



## Guest (19. Jan 2008)

Angel4585 hat gesagt.:
			
		

> ne das anzahlBenutzung sagt mir wie oft eine Person einen Gegenstand benutzt hat, darauf kann ich nicht verzichten.
> Ausserdem sollen da noch mehr Werte rein.


Dann bleibt noch ein Map mit Gegenstand als Key und einem Embedable als Value. 

z.B.
	
	
	
	





```
@CollectionOfElements 
@JoinTable(name = "GEGENSTAND_BENUTZUNG", joinColumns = @JoinColumn(name = "ID"))  // das ist die Id des aktuellen Datensatzes.
@MapKey(columns = @Column(name="GEGENSTANDID")) 
Map<Gegenstand, Benutzung> gegenstaende = new HashMap<Gegenstand, Benutzung>();


...

@Embedable
class Benutzung {

   ... was auch immer

}
```

Siehe auch http://www.java-forum.org/de/viewtopic.php?t=62152
Da habe ich mal ein vergleichbares Beispiel beschrieben.


----------

