@OneToMany Liste Probleme mit Identity Keys

y0dA

Top Contributor
Hi!
Folgendes Szenario:
Ich habe eine bidirektionale Beziehung zwischen Klasse Dokument und Klasse Status:
Java:
public class Ueberklasse{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	protected Integer id;
}

public class Dokument extends Ueberklasse{
	@OneToMany(mappedBy = "dokument", cascade = { CascadeType.MERGE,
			CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.EAGER)
	private List<Status> statusListe;
..
}

public class Status {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@ManyToOne(cascade = CascadeType.REFRESH)
	@JoinColumn(name = "dokument")
	private Dokument dokument;
..
}

Wenn ich nun in meiner Applikation ein neues Objekt vom Typ "Dokument" anlege dann hat der bspw. den Status "beantragt" und sonst keinen weiteren Status, sprich in der Liste ist genau 1 Eintrag. Das ganze wird dann über folgende Methode persistiert:
Java:
..
	@PersistenceContext(unitName = "asdf")
	private EntityManager em;
..

	@Override
	public T create(T entity) throws EntityExistsException,
			IllegalStateException, IllegalArgumentException,
			TransactionRequiredException {
		if (logger.isTraceEnabled()) {
			logger.trace("CRUDEntityFacade.create("
					+ entityClass.getSimpleName() + ")");
		}
		em.persist(entity);

		return entity;
	}
Hierbei werden alle Objekte korrekt gespeichert und nachdem "flush()" welches nachdem create aufgerufen wird sind auch alle Primärschlüssel in den Objekten gesetzt (sprich entity hat die ID gesetzt was vor dem flush() nicht so ist).

Im Folgenden kann es nun vorkommen dass sich der Status "ändert", hierbei wird nicht das aktuelle Status Objekt aktualisiert sondern ein neues Objekt mit dem neuen Status angelegt und in die "Liste statusListe" hinzugefügt (sprich es gibt dann 2 Einträge, den Ursprungsstatus und den neuen - noch nicht persistierten- Status). Hierbei wird nun folgende Methode aufgerufen:
Java:
	@Override
	public T update(T entity) throws IllegalStateException,
			IllegalArgumentException, TransactionRequiredException {
		if (logger.isTraceEnabled()) {
			logger.trace("CRUDEntityFacade.update("
					+ entityClass.getSimpleName() + ")");
		}
		em.merge(entity);

		if (logger.isDebugEnabled()) {
			logger
					.debug("CRUDEntityFacade.update(Serializable) updated 1 entity: "
							+ entity.toString());
		}
		return entity;
	}

Das Ergebnis davon ist nun dass der neue Status zwar persistiert wird jedoch die ID nicht gesetzt wird. Auch flush() bringt hier keine Abhilfe.

Ist natürlich unschön dass die ID nicht gesetzt wird und die Objekte neuladen nach dem speichern sollte eigentlich auch nicht der richtige Weg sein, zumal es beim speichern ja klappt - nur das merge macht Probleme.
 
G

Gelöschtes Mitglied 5909

Gast
Für neue PKs aus der Sequence persist nutzen.

Ich mach mein ich immer
persist()
flush()
refresh()

Um rauszukriegen bo du persist oder merge nutzen musst, kannst du contains bzw find nutzen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand OneToMany löscht Eintrag aus Collection Data Tier 0
OnDemand Hibernate OneToMany oder lieber OneToOne Data Tier 16
OnDemand OneToMany Composite Key Mapping Data Tier 18
D Hibernate Umsetzung multiple OneToMany Beziehung Data Tier 6
C JPA FetchType.LAZY, Relation @OneToMany und Problem mit dem update Data Tier 1
M Hibernate Reads Nulls in OneToMany Data Tier 1
J OneToMany Data Tier 9
H Hibernate Problem mit Lazy Loading bei @OneToMany Collections Data Tier 5
C JPA oneToMany/ManyToOne bidirektional verwirrung Data Tier 6
G Hibernate OneToMany und ManyToOne Objekte löschen Data Tier 13
N Löschen OneToMany Beziehung (delete-orphan) geht nicht Data Tier 2
F @OneToMany ohne Fremdschlüssel Data Tier 3
G OneToMany undirektional Data Tier 3
D OneToMany ohne Join Table Data Tier 3
D Hibernate Liste von Enumerations Data Tier 1
P JPA Liste<String> in Tabelle abbilden? Data Tier 0
S Hibernate: Objekt aus Liste löschen Data Tier 3
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
HaukeG @MappedSuperclass Probleme und Lösungsideen gesucht Data Tier 6
X CLOB lenght Probleme unter verschiedenen Datenbanken (eclispelink) Data Tier 2
A Probleme beim deployen Data Tier 4
T Probleme mit Schema (Hibernate) Data Tier 15
GilbertGrape Probleme mit einem Query (left join) Data Tier 2
GilbertGrape hibernate: Probleme mit Queries Data Tier 2

Ähnliche Java Themen


Oben