我有一个像这样的实体:
@Entity
@Table(name = "THISBEAN")
public class ThisBean {
...
@OneToMany(targetEntity = SomeBean.class, mappedBy = "thisBean", fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.DETACH})
private List<SomeBean> bean;
...
}
当我删除ThisBean时,应该保留SomeBean。它运行正常,当我以后想要使用entityManager.find(persistentClass, id);
访问SomeBean时,它会让我异常javax.persistence.EntityNotFoundException: Unable to find com.xxx.yyy.ThisBean with id someId
我查看了表SomeBean
,并引用了引用ThisBean的外键。我该如何解决它以便以后可以从数据库访问SomeBean
实例?这是SomeBean类的代码:
@Entity
@Table(name = "SOMEBEAN")
public class SomeBean {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "THISBEAN")
private ThisBean thisBean;
...
}
答案 0 :(得分:0)
小偷杀死了蝙蝠侠的父母,是的,蝙蝠侠有父母和傻瓜。记忆,但他们不能帮助他们活着
当您调用em.remove(id);
数据库行从数据库中删除时。
当您调用em.find(SomeClass.class, id);
时,entityManager尝试查找具有匹配主键的行,因此您获得了javax.persistence.EntityNotFoundException
如何解决它以便以后可以从数据库访问SomeBean实例?这是SomeBean的代码
即使您可以通过执行某些jpql函数或其他方式从ThisBean
获取SomeBean
的id,ThisBean
数据库表也不包含任何带有mathing的行id
1}}所以不可能让实体回来。
如果您确实想要这样做,请创建一个具有相同id
的新实体,然后调用em.persist(thisBeanEntity)
,使其托管,然后再次调用em.find(id)
修改强>
在您移除 ThisBean 之前,请尝试从null
SomeBean
someBean.setThisBean(null);
这样您就可以打破关系,外键列值将为null
。
请记住,维护实体关系是应用程序(或开发人员)的责任,而不是jpa实现。
即使您使用双向关系,也需要从任意一侧设置两个实体。