# JPA.merge()



## Guest (9. Feb 2009)

Hallo zusammen,

Ich arbeite momentan mit EclipseLink und verstehe nicht so ganz die Funktionsweise der merge()-Methode des EntityManagers.

Hier mein Fall:

Ich habe ein Objekt Immobilie, dass eine 1:1 Referenz zu Stammdaten hat. Die STammdaten haben eine 1:n Referenz zu Grundbücher und jedes Grundbuch hat eine 1:n Beziehung zu Grundstücken.

Dieses Baumkonstrukt erhalte ich auch von meinem Client.

Nun dachte ich mir folgendes. Ich brauche lediglich die Immobilie mit allen Refernzen nach unten der merge Methode zu übergeben und diese ermittelt die Änderungen und führt auf entsprechende Teilobjekte die Änderungen durch. Teile die sich nicht geändert haben hängen allerdings nicht am Baum.

Dummerweise macht die merge-Methode dies nicht. Obwohl eine Änderung im untersten Teil des Baumes stattgefunden hat (Grundstück) wird dies nicht als Änderung erkannt, sondern versucht dieses Grundstück neu anzulegen, was zu einer Exeption führt, da das Grundstück mit jener Id bereits vorhanden ist.

Meine Fragen:
Gehe ich recht in der Annahme, dass das merge komplexe Baumstrukturen zusammenführen kann, oder muss ich jede Ebene des Baumes einzeln mergen?
Gibt es Links zu Implementierungen die eine solche Komplexität vorweisen?
Habe ich die merge-Methode richtig verstanden? Oder liege ich da falsch?

Wäre um jede Hilfe dankbar.


----------



## Gelöschtes Mitglied 5909 (9. Feb 2009)

Du musst den CascadeType angeben, damit er weiß was er mit den referenzierten Entities machen soll.

Beispiel:


```
@OneToMany(fetch=FetchType.EAGER, targetEntity=Article.class, mappedBy="category", 
		cascade={
			CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH
		}
	)
	private List<Article> 	articles = new ArrayList<Article>();
```

und das Gegenstück


```
@ManyToOne(fetch=FetchType.EAGER, targetEntity=Category.class, 
		cascade={
			CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH
		}
	)
	@JoinColumn(name="CATEGORY_ID")
	private Category 	category;
```

Es gibt

CascadeType.PERSIST
CascadeType.REFRESH
CascadeType.MERGE
CascadeType.REMOVE
CascadeType.ALL

(Namen sind selbsterklärend denke ich)

In Grundstücke mit einzubeziehen muss bei Grundbuch CascadeType.MERGE ebenfalls rein.


----------

