“没有给定标识符的行存在”,尽管它存在

我正在使用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不强制执行外键完整性,因此在插入损坏的数据时不会抱怨。

解决方案:可选=真实或正确插入数据。

可能的原因:

  1. 该行由第一个会话插入,但第二个会话尝试访问时未提交事务。
  2. 由于某种原因,第一个会话是支持滚动的。

听起来你的事务插入是回滚的

这个问题背后的主要原因是数据不匹配,例如我有一个名为“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)

   <![CDATA[FK References]]>       

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。