2012-03-25 58 views
0

我有以下雙向1:N的關係中,用戶實體和工作單位之間:JPA持續對象與cascase關係,然後將其刪除(休眠)

用戶等級:

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

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

招聘類:

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

現在保存用戶對象(而讓Hibernate會自動保存作業實體)時,我想刪除從DB我得到一個工作實體工程... 然後ñ例外....

 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(); 

例外:

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>] 

爲什麼會發生這種情況?順便說一句。當我明確地呼籲堅持工作對象的問題不會發生......但我不想堅持工作分開,但讓冬眠堅持他們(與級聯,其實際工作....)

thx

+0

我可能有一個想法,但我不知道。你能否在第一次提交後添加'entityManager.flush()'並告訴我接下來會發生什麼。我的想法是,這取決於你的沖洗策略... – kraftan 2012-03-25 18:10:00

+0

嗨,謝謝你的回覆。添加entityManager.flush()不能解決問題。 :/ – Moonlit 2012-03-25 18:23:31

回答

1

你需要,當你刪除實體刪除該用戶的工作:

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

或您自己的建議:在工作集合添加orphanRemoval=true

+0

謝謝。這工作!另外一種方法是在作業集合上使用orphanRemoval = true ... – Moonlit 2012-03-25 19:24:57

+0

如果你找到你想要的東西,你應該接受這個解決方案。 – barsju 2012-03-25 21:01:34