我正在使用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);
}
尤里卡,我找到了!
问题如下:
表ThirdClass
中的数据未正确保留。由于此数据是从MyDbObject引用的
optional = false
Hibernate进行了内连接,因此为连接返回一个空结果。因为如果在一个会话中执行数据(我想在缓存中),那就没有问题了。
MySQL不强制执行外键完整性,因此在插入损坏的数据时不会抱怨。
解决方案:可选=真实或正确插入数据。
可能的原因:
听起来你的事务插入是回滚的
这个问题背后的主要原因是数据不匹配,例如我有名为“X”的实体映射类,它有列“column1”,它引用了表“Y”列“column1”,如下所示
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "column1", referencedColumnName = "column1")
public Y getColumn1() {
return Y;
}
在此,如果X表column1具有值但是Y表column1没有值。这里链接将失败。
这就是我们将获得Hibernate objectNotFound异常的原因
也可以通过创建适当的数据模型来解决此问题,例如创建正确的索引和约束(主键/外键)。
这可能是你的情况,请在另一篇文章中查看我的答案。
https://stackoverflow.com/a/40513787/6234057
我有相同的Hibernate异常。
经过一段时间的调试后,我意识到问题是由Orphan子记录引起的。
许多人在抱怨,当他们搜索记录时,它就存在了。我意识到问题不在于记录的存在,而是hibernate没有在表中找到它,而是由于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
在所有引用的表中查找孤立记录
从CHILD TABLE中选择*,其中FOREIGN KEY不在(从PARENT TABLE中选择PRIMARY KEY);
删除这些孤立记录,提交更改并根据需要重新启动服务器。
这解决了我的例外。你可以尝试一样。
请更新您的hibernate
配置文件,如下所示:
property start tag name="hbm2ddl.auto" create/update property close tag
我发现在Oracle中,这个问题也可能是由权限问题引起的。 MyDbObject实例引用的ProblemClass实例可能存在,但具有不允许当前用户查看它的权限,即使用户可以看到当前的MyDbObject。