我正在使用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;
}
我绝对不知道哪里可以看。任何提示高度赞赏!
只是为了澄清: 数据被插入到应用程序的另一个RUN中。它肯定在数据库中,因为我可以在应用程序终止后通过SQL查询看到它。在那之后,即再次启动应用程序时,我在数据库的FIRST查询中得到错误 - 没有删除,也没有涉及回滚。
增加: 因为有人问过,这里是获取数据的代码:
public List<ProblemClass> getProblemClasses() {
Query query = session.createQuery("from ProblemClass");
return query.list();
}
只是为了完成它,这里是插入它的通用代码(在获取应用程序的另一个RUN之前):
public void save(Persistent persistent) {
session.saveOrUpdate(persistent);
}
答案 0 :(得分:24)
问题如下:
表ThirdClass
中的数据未正确保留。由于此数据是通过
optional = false
Hibernate创建了一个内连接,因此为连接返回一个空结果。因为如果在一个会话中执行数据(我想在缓存中),那就没有问题了。
MySQL不强制执行外键完整性,因此在插入损坏的数据时不会抱怨。
解决方案:可选=真实或正确插入数据。
答案 1 :(得分:5)
可能的原因:
答案 2 :(得分:2)
听起来你的事务插入是回滚的
答案 3 :(得分:2)
这个问题背后的主要原因是数据不匹配,例如我有名为“X”的实体映射类,它有列“column1”,它引用了表“Y”列“column1”,如下所示
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "column1", referencedColumnName = "column1")
public Y getColumn1() {
return Y;
}
在此表中,如果X表column1具有值,但Y表column1没有值。这里链接将失败。
这就是我们得到 Hibernate objectNotFound异常的原因
也可以通过创建适当的数据模型来解决此问题,例如创建正确的索引和约束(主键/外键)。
答案 4 :(得分:1)
这可能是你的情况,请在另一篇文章中查看我的答案。
https://stackoverflow.com/a/40513787/6234057
我有相同的Hibernate异常。
经过一段时间的调试后,我意识到问题是由Orphan子记录引起的。
许多人在抱怨,当他们搜索记录时,它就存在了。 我意识到问题不是因为记录的存在而是休眠而不是在表中找到它,而是由于Orphan子记录。
参考不存在的父母的记录!
我所做的是,找到对应于链接到Bean的表的外键引用。
在SQL开发人员中查找外键引用
1.将以下XML代码保存到文件(fk_reference.xml)
中<items>
<item type="editor" node="TableNode" vertical="true">
<title><![CDATA[FK References]]></title>
<query>
<sql>
<![CDATA[select a.owner,
a.table_name,
a.constraint_name,
a.status
from all_constraints a
where a.constraint_type = 'R'
and exists(
select 1
from all_constraints
where constraint_name=a.r_constraint_name
and constraint_type in ('P', 'U')
and table_name = :OBJECT_NAME
and owner = :OBJECT_OWNER)
order by table_name, constraint_name]]>
</sql>
</query>
</item>
2.将USER DEFINED扩展添加到SQL Developer
单击“确定”,然后重新启动SQL Developer
3.导航到任何表,您将能够在SQL旁边看到另一个标签,标记为FK References,显示FK信息。
4.Reference
http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html
查找所有推荐表格中的孤儿记录
从CHILD_TABLE中选择* FOREIGNKEY不在的地方(从PARENT_TABLE中选择PRIMARYKEY);
删除这些孤立记录,提交更改并根据需要重新启动服务器。
这解决了我的异常。你可以尝试一样。
答案 5 :(得分:0)
请更新您的hibernate
配置文件,如下所示:
property start tag name="hbm2ddl.auto" create/update property close tag
答案 6 :(得分:0)
我发现在Oracle中,这个问题也可能是由权限问题引起的。 MyDbObject实例引用的ProblemClass实例可能存在但具有不允许当前用户查看它的权限,即使用户可以看到当前的MyDbObject。