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

时间:2010-05-17 07:20:24

标签: java hibernate

我正在使用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);
}

7 个答案:

答案 0 :(得分:24)

尤里卡,我找到了它!

问题如下:

ThirdClass中的数据未正确保留。由于此数据是通过

从MyDbObject引用的
optional = false

Hibernate创建了一个内连接,因此为连接返回一个空结果。因为如果在一个会话中执行数据(我想在缓存中),那就没有问题了。

MySQL不强制执行外键完整性,因此在插入损坏的数据时不会抱怨。

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

答案 1 :(得分:5)

可能的原因:

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

答案 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

查找所有推荐表格中的孤儿记录

  

从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。