我正在使用 Hibernate 并得到
线程“main”中的异常 org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[#271]
这个错误的奇怪之处在于,具有给定 id 的对象存在于数据库中。我在应用程序的另一次运行中插入了有问题的记录。如果我在同一运行中访问它(即同一休眠会话),则检索数据似乎没有问题。
只是因为这可能是映射的错误:
public class ProblemClass implements Persistent {
@ManyToOne(optional = false)
private MyDbObject myDbObject;
}
public class MyDbObject implements Persistent {
@OneToMany(mappedBy = "myDbObject")
private List<ProblemClass> problemClasses;
@ManyToOne(optional = false)
private ThirdClass thirdClass;
}
我完全不知道该看哪里。任何提示都非常感谢!
只是为了澄清:
数据被插入到应用程序的另一个运行中。它肯定在数据库中,因为我可以在应用程序终止后通过 SQL 查询看到它。之后,即再次启动应用程序时,我在数据库的第一个查询中收到错误 - 不删除,不涉及回滚。
添加:
因为有人问,这里是获取数据的代码:
public List<ProblemClass> getProblemClasses() {
Query query = session.createQuery("from ProblemClass");
return query.list();
}
为了使其完整,这里是插入它的通用代码(在应用程序的另一个运行中获取之前):
public void save(Persistent persistent) {
session.saveOrUpdate(persistent);
}
尤里卡,我找到了!
问题如下:
表中数据ThirdClass
没有正确坚持。由于该数据是通过 MyDbObject 引用的
optional = false
Hibernate 进行了内部联接,从而为联接返回空结果。因为如果在一个会话中执行的话数据就在那里(我猜是在缓存中),所以不会出现任何问题。
MySQL 不强制外键完整性,因此不会抱怨插入损坏的数据。
解决方案:Optional = true 或正确插入数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)