# Hibernate:merge



## nielson123 (4. Jan 2011)

Hallo ich habe eine Frage zum merge beim EntityManager in Hibernate.

Wenn ich eine bidirektionale Beziehung in Hibernate habe und ich das Vaterobjekt (ein unwichtiges Attribut), das ein Cascade.All zum Sohnobjekt hat, anpassen will (mit merge) kommt bei mir immer eine Fehlermeldung. An was könnte das denn liegen.

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractCollection.add(AbstractCollection.java:221)
	at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:507)
	at org.hibernate.type.CollectionType.replace(CollectionType.java:581)
	at org.hibernate.type.TypeFactory.replace(TypeFactory.java:548)
	at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:563)
	at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:288)
	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:261)
	at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:869)
	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:851)
	at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:279)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
	at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:630)
	at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:287)
	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:261)
	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:84)
	at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:859)
	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:843)
	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:847)
	at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:682)
	at Test.main(Test.java:134)


----------



## nielson123 (4. Jan 2011)

Also auf diese Art:

In Klasse Mannschaft:

```
protected Map<String, Spieler> spieler = null;
@OneToMany(mappedBy = "mannschaft", cascade = CascadeType.ALL)
public Collection<Spieler> getSpieler() {
		return spieler.values();
	}

	public void setSpieler(Collection<Spieler> spieler) {
		if (this.spieler == null) {
			this.spieler = new HashMap<String, Spieler>();
		} else {
			this.spieler.clear();
		}

		for (Spieler s : spieler) {
			this.spieler.put(s.getspielername(), s);
		}
	}
```

Und in Klasse Spieler:

```
protected Mannschaft mannschaft = null;
@ManyToOne
	@JoinColumn(name = "mannschaft_id")
	public Mannschaft getmannschaft() {
		return mannschaft;
	}

	public void setmannschaft(Mannschaft mannschaft) {
		this.mannschaft = mannschaft;
	}
```

Da kommt wie gesagt in einem Test, wenn ich eine Mannschaft mergen will der obige Fehler.


----------



## SlaterB (4. Jan 2011)

OneToMany dürfte normalerweise durch eine Liste oder Set umgesetzt sein, 
Hibernate nimmt das wahrscheinlich an und will dort mit add() etwas hinzufügen,
das geht im values()-Set der Map kaum

ich schätze du musst eine klassische Umsetzung wählen und wenn dann die Map separat vorhalten,

wie soll das eigentlich bisher funktionieren bzw. wie funktioniert es, wenn Hibernate ein Objekt aus der DB lädt?
wird dann die Map automatisch gefüllt? mit welchen Keys?
ach halt, setSpieler() macht das ja,
dann hast du wohl nur genau in dieser merge-Situation das Problem, dass Hibernate da in der getSpieler()-Collection add() aufrufen will,
Pech gehabt


----------



## nielson123 (4. Jan 2011)

Danke schonmal!

Warum will Hibernate da mit add() etwas hinzufügen?

Hat jemand eine Lösung für das Problem?


----------

