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
答
你需要,当你删除实体删除该用户的工作:
entityManager.getTransaction().begin();
j.getUser().getJobs().remove(j);
entityManager.remove(j);
entityManager.getTransaction().commit();
或您自己的建议:在工作集合添加orphanRemoval=true
。
我可能有一个想法,但我不知道。你能否在第一次提交后添加'entityManager.flush()'并告诉我接下来会发生什么。我的想法是,这取决于你的冲洗策略... – kraftan 2012-03-25 18:10:00
嗨,谢谢你的回复。添加entityManager.flush()不能解决问题。 :/ – Moonlit 2012-03-25 18:23:31