JPA持续对象与cascase关系,然后将其删除(休眠)

问题描述:

我有以下双向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

你需要,当你删除实体删除该用户的工作:

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