# JPA - HashMap mit Many-to-Many Relation Problem



## pokisto (10. Aug 2011)

Hallo zusammen,

Vorher habe ich Arraylist statt HashMap mit Hibernate gespeichert. Es hat wunderbar mit folgende Annotation geklappt.


```
@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="join_node_edge",
			joinColumns={@JoinColumn(name="nodeID")},
			inverseJoinColumns={@JoinColumn(name="edgeID")})
	public List<Edge> getEdges() {
		return edges;
	}
```


Aber ich brauche jetzt HashMap und es funktioniert nicht mehr mit vorherigen Annotation .

Node.java

```
@Entity
public class Node implements Serializable{

        private String nodeID;
	private Map<String, Edge> edges = new HashMap<String, Edge>();
         ....

	@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="join_node_edge",
			joinColumns={@JoinColumn(name="nodeID")},
			inverseJoinColumns={@JoinColumn(name="edgeID")})
	public Map<String, Edge> getEdges() {
		return edges;
	}
   
        ....
}
```


Edge.java

```
@Entity
public class Edge implements Serializable{

        private String edgeID;
	private Map<String, Node> nodes = new HashMap<String, Node>();
        ....

  	@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="join_node_edge",
			joinColumns={@JoinColumn(name="edgeID")},
			inverseJoinColumns={@JoinColumn(name="nodeID")})
	public Map<String, Node> getNodes() {
		return nodes;
	}

        ....
```

Hat jemand Idee, wie man mit Many-to-Many Relation und HashMap umgehen kann?

Besteht eine Möglichkeit, HashMap-Schlüssel in Datenbank zu speichern?


----------



## bluer (15. Aug 2011)

Wie es aussieht möchtest du ein Graphentheoretisches  Programm schreiben und in deiner Hashmap zu jeder Kante die inzidenten Knoten speichert und umgekehrt. Wozu benötigst du hier eine HashMap. Jede Kante und jeder Knoten ist doch eindeutig über sein ID identifizierbar und kann somit über die DB abgerufen werden. Somit könntest du es doch bei einer normalen Liste belassen?!


----------



## pokisto (15. Aug 2011)

Damit ich die Knoten und Kanten schnell vergleichen und suchen kann, verwende ich statt ArrayList HashMap.

z.B. "containKey(String id)"


----------



## bluer (15. Aug 2011)

Alternativ könntest du in deiner Verbundtabelle noch eine Spalte hinzufügen, in der der Key deiner HashMap steht. Siehe hierzu: Java Persistence/ManyToMany - Wikibooks, open books for an open world

Meines Erachtens kommst du nicht drum herum die ManyToMany Beziehung über Listen zu realisieren.


----------



## pokisto (16. Aug 2011)

Node.java

```
....
	@ManyToMany
	public Map<String, Edge> getEdges() {
		return edges;
	}
        ....
```


Edge.java

```
....
	@ManyToMany
	public Map<String, Node> getNodes() {
		return nodes;
	}
        ....
```

Mit der obigen Annotation kann das Problem mit Many-To-Many Relation gelöst werden 

Es wird dann 4 Tabellen automatisch generiert

1. node - Tabelle
2. edge - Tabelle
3. node_edge - Tabelle
4. edge_node - Tabelle


----------

