“没有给定标识符的行存在”,尽管它存在
我正在使用Hibernate并获取
线程“main”中的exceptionorg.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[#271]
这个错误很奇怪的是,具有给定id的对象存在于数据库中。 我在有问题的应用程序运行中插入了有问题的记录。 如果我在同一次运行中访问它(即相同的hibernate会话),则检索数据似乎没有问题。
仅仅因为它可能是映射的错误:
public class ProblemClass implements Persistent { @ManyToOne(optional = false) private MyDbObject myDbObject; } public class MyDbObject implements Persistent { @OneToMany(mappedBy = "myDbObject") private List problemClasses; @ManyToOne(optional = false) private ThirdClass thirdClass; }
我绝对不知道哪里可以看。 任何提示高度赞赏!
只是为了澄清:数据被插入到应用程序的另一个RUN中。 它肯定在数据库中,因为我可以在应用程序终止后通过SQL-Query看到它。 在那之后,即再次启动应用程序时,我在数据库的FIRST查询中得到错误 – 没有删除,也没有涉及回滚。
另外:因为有问题,这里是获取数据的代码:
public List getProblemClasses() { Query query = session.createQuery("from ProblemClass"); return query.list(); }
只是为了完成它,这里是插入它的通用代码(在获取应用程序的另一个RUN之前):
public void save(Persistent persistent) { session.saveOrUpdate(persistent); }
尤里卡,我找到了!
问题如下:
表ThirdClass
的数据未正确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 objectNotFoundexception的原因
也可以通过创建适当的数据模型来解决此问题,例如创建正确的索引和约束(主键/外键)。
这可能是你的情况,请在另一篇文章中查看我的答案。
https://stackoverflow.com/a/40513787/6234057
我有相同的Hibernateexception。
经过一段时间的调试后,我意识到问题是由Orphan子记录引起的。
正如许多人在抱怨,当他们搜索记录时,它就存在了。 我意识到问题不是因为记录的存在而是hibernate没有在表中找到它,而是由于Orphan子记录。
记录中提到了不存在的父母!
我所做的是,找到对应于链接到Bean的表的外键引用。
在SQL开发人员中查找外键引用
1.将以下XML代码保存到文件中(fk_reference.xml)
-
2.将USER DEFINED扩展添加到SQL Developer
- 工具>首选项
- 数据库>用户定义的扩展
- 单击“添加行”按钮
- 在类型中选择“编辑器”,位置 – 您保存上面的xml文件的位置
-
单击“确定”,然后重新启动SQL Developer
3.导航到任何表,您将能够在SQL旁边看到另一个标签,标记为FK References,显示FK信息。
4.Reference
-
http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html
- 如何在Oracle SQL Developer中找到哪些表引用给定表?
在所有引用的表中查找孤立记录
从CHILD_TABLE中选择*,其中FOREIGNKEY不在(从PARENT_TABLE中选择PRIMARYKEY);
删除这些孤立记录,提交更改并根据需要重新启动服务器。
这解决了我的例外。 你也可以尝试一下。
请更新您的hibernate
配置文件,如下所示:
property start tag name="hbm2ddl.auto" create/update property close tag
我发现在Oracle中,这个问题也可能是由权限问题引起的。 MyDbObject实例引用的ProblemClass实例可能存在,但具有不允许当前用户查看它的权限,即使用户可以看到当前的MyDbObject。