【问题标题】:"No row with the given identifier exists" although it DOES exist“不存在具有给定标识符的行”尽管它确实存在
【发布时间】:2011-02-20 07:01:26
【问题描述】:

我正在使用 Hibernate 并获得

线程“主”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 查询看到它。在那之后,即再次启动应用程序时,我在数据库的第一个查询中得到错误——没有删除,没有涉及回滚。

补充: 因为被问到了,所以这里是获取数据的代码:

public List<ProblemClass> getProblemClasses() {
    Query query = session.createQuery("from ProblemClass");
    return query.list();
}

为了使其完整,这里是插入它的通用代码(在应用程序的另一个 RUN 中获取之前):

public void save(Persistent persistent) {
    session.saveOrUpdate(persistent);
}

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    尤里卡,我找到了!

    问题如下:

    ThirdClass 表中的数据未正确持久化。由于此数据是通过

    从 MyDbObject 引用的
    optional = false
    

    Hibernate 进行了内部连接,因此返回的连接结果为空。因为如果在一个会话中执行数据就在那里(我猜是在缓存中),所以没有问题。

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

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

    【讨论】:

    • 非常感谢您发布答案!
    【解决方案2】:

    可能的原因:

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

    【讨论】:

    • 也很抱歉不清楚:数据被插入到应用程序的另一个 RUN 中。它肯定在数据库中,因为我可以在应用程序终止后通过 SQL 查询看到它。之后我在数据库的第一个查询中得到错误。
    【解决方案3】:

    听起来您的事务插入已回滚

    【讨论】:

    • 抱歉不清楚:数据被插入到应用程序的另一个 RUN 中。它肯定在数据库中,因为我可以在应用程序终止后通过 SQL 查询看到它。之后我在数据库的第一个查询中得到错误。
    【解决方案4】:

    这个问题背后的主要原因是数据不匹配,例如我有一个名为“X”的实体映射类,它有“column1”列,它引用了表“Y”列“column1”,如下所示

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "column1", referencedColumnName = "column1")
    public Y getColumn1() {
        return Y;
    }
    

    在这种情况下,如果 X 表 column1 有值但 Y 表 column1 没有值。这里链接会失效。

    这就是我们会得到 Hibernate objectNotFound 异常

    的原因

    这个问题也可以通过创建适当的数据模型来解决,例如创建适当的索引和约束(主键/外键)..

    【讨论】:

      【解决方案5】:

      这可能是你的情况,请在另一篇文章中查看我的答案。

      https://stackoverflow.com/a/40513787/6234057

      我有同样的 Hibernate 异常。

      经过一段时间的调试,我意识到问题是由孤儿记录引起的。

      正如许多人抱怨的那样,当他们搜索记录时,它存在。 我意识到问题不是因为记录的存在,而是休眠在表中找不到它,而是由于孤儿记录。

      与不存在的父母有关的记录!

      我所做的是,找到与链接到 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.在 SQL Developer 中添加 USER DEFINED 扩展

      在所有引用表中查找孤立记录

      从 CHILD_TABLE 中选择 * 其中 FOREIGNKEY 不在(从 PARENT_TABLE 中选择 PRIMARYKEY);

      删除这些孤立记录,提交更改并在需要时重新启动服务器。

      这解决了我的异常。你也可以试试。

      【讨论】:

        【解决方案6】:

        请更新您的hibernate 配置文件,如下所示:

        property start tag name="hbm2ddl.auto" create/update property close tag
        

        【讨论】:

          【解决方案7】:

          我发现在 Oracle 中这个问题也可能是由权限问题引起的。 MyDbObject 实例引用的 ProblemClass 实例可能存在,但具有不允许当前用户看到它的权限,即使用户可以看到当前的 MyDbObject。

          【讨论】:

            猜你喜欢
            • 2013-03-29
            • 2012-02-17
            • 1970-01-01
            • 2015-06-02
            • 2013-08-28
            • 2013-10-11
            • 2017-10-17
            相关资源
            最近更新 更多