2012-03-25 11 views
0

Ich habe folgende bidirektionale 1: n-Beziehung zwischen einem Benutzer Einheit und eine Job Einheit:JPA besteht Objekt mit cascase Beziehung und dann löscht (Hibernate)

Benutzerklasse:

... 
    @OneToMany(mappedBy = "user",cascade={CascadeType.PERSIST}) 
    public Collection<Job> getJobs() { 
     return jobs; 
    } 

public void addJob(Job j) { 
    jobs.add(j); 
    j.setUser(this); 
} 
... 

Jobklasse :

// Job class 
... 
@ManyToOne 
    public User getUser() { 
     return user; 
    } 

nun ein User-Objekt (und lassen Sie den Ruhezustand automatisch den Job Einheit speichern) speichern funktioniert ... Dann, wenn ich den Job Entität aus der db i a erhalten löschen möchten n Ausnahme ....

 User user = new User(); 
     user.addJob(new Job()); 


     entityManager.getTransaction().begin(); 
     entityManager.persist(user); 
     entityManager.getTransaction().commit(); 

     Job j = entityManager.find(Job.class, 1L); 

     entityManager.getTransaction().begin(); 
     entityManager.remove(j); 
     entityManager.getTransaction().commit(); 

Ausnahme:

Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction 
Caused by: javax.persistence.EntityNotFoundException: deleted entity passed to persist: [dst1.model.Job#<null>] 

warum geschieht dies? übrigens. Wenn ich explizit anrufe mit dem Job-Objekt das Problem tritt nicht auf ... aber ich möchte Job nicht getrennt persistieren, aber Ruhe bewahren sie (mit Kaskade, die tatsächlich funktioniert ....)

thx

+0

Ich habe vielleicht eine Idee, aber ich bin mir nicht sicher. Könnten Sie bitte 'entityManager.flush()' nach dem ersten Commit hinzufügen und mir sagen, was dann passiert. Meine Idee ist, dass es auf deine Spülstrategie ankommt ... – kraftan

+0

Hallo, und danke für deine Antwort. Das Hinzufügen von entityManager.flush() löst das Problem nicht. :/ – Moonlit

Antwort

1

Sie müssen den Job vom Benutzer entfernen, wenn Sie das Objekt löschen:

entityManager.getTransaction().begin(); 
    j.getUser().getJobs().remove(j); 
    entityManager.remove(j); 
    entityManager.getTransaction().commit(); 

Oder indem Sie Ihren eigenen Vorschlag: orphanRemoval=true auf der Arbeits Sammlung hinzufügen.

+0

Danke. Das hat funktioniert! Eine alternative Möglichkeit, die ich herausgearbeitet habe, ist die Verwendung von orphanRemoval = true in der Job-Sammlung ... – Moonlit

+0

Sie sollten die Lösung akzeptieren, wenn Sie haben, wonach Sie suchen. – barsju

Verwandte Themen