EJB3 persistenz problem

Hallo,

bin am verzweifeln. Ich habe zwei(drei) Entity-Beans: Specialrelease und Request(Recipient).

In Specialrelease habe ich folgende Beziehung
Java:
@OneToMany(mappedBy="specialrelease", cascade=CascadeType.REMOVE)
	private List<Request> requests;

das Gegenstück dazu, Request
Java:
@ManyToOne
	@JoinColumn(name="specialrelease_id")
	private SpecialRelease specialrelease;

und folgende Action
Java:
public void addRecipient(Recipient rec){
		List<Request> requests = specialrelease.getRequests();
		boolean containRecipient = false;
		for(Request q:requests){
			boolean temp = q.getRecipient().equals(rec);
			if(temp){
				containRecipient = true;
			}
		}
		if(!containRecipient){
			Request e = new Request();
			String uniqueId = e.getInternalUUID();
			e.setUniqueRequestId(uniqueId);
			e.setRecipient(rec);
			e.setRequestDate(new GregorianCalendar());
			e.setSpecialrelease(specialrelease);
			requests.add(e);
			specialrelease.setStatus(SpecialRelease.Status.NOTRELEASED);
		}else{
			/**
			 * Message
			 */
		}
	}

In einer Oberklasse der Action wird gespeichert
Java:
@End
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void save(){
		T entity = getEntity();
		preProcedure();
		try{
			if(state == NEW || state == CREATED){
				em.persist(entity);
			}
			if(state == MODIFIED){
				em.merge(entity);
			}
			em.flush();
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

Und hier der Error
Code:
java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: de.bosch.ecp.model.Request

Verwende ich nun im Specialrelease
Java:
@OneToMany(mappedBy="specialrelease", cascade=CascadeType.ALL)
	private List<Request> requests;

wird die Speicherung ohne Probleme durchgeführt. Problem hierbei ist nur, das ein neuer Request auch ohne explizites speichern von Hibernate in der Datenbank gespeichert wird.
Sprich: Ich habe einen Specialrelease-Editor mit den Möglichkeiten zu speichern, abzubrechen und neue Empfänger(Recipient) hinzuzufügen.

Füge ich nun im Falle der letzteren Konfiguration einen neuen Recipient hinzu und gehe danach auf "Abbrechen" ist der neue Request bereits in der Datenbank gespeichert worden.

Eine Möglichkeit wäre natürlich die speichern-Methode so zu erweitern dass der Request im Falle der ersten Konfiguration zuvor vom Entitymanger persist gemacht wird. Dies ist mir allerdings nicht recht, da die speichern-Methode von vielen anderen Klassen auch verwendet wird.

Ich hoffe ich konnte mich verständlich ausdrücken und noch mehr hoffe ich, dass mir jemand weiterhelfen kann.



Gruß
Andreas
 
Zurück