开发者

"No row with the given identifier exists" although it DOES exist

开发者 https://www.devze.com 2022-12-30 06:52 出处:网络
I am using Hibernate and getting 开发者_StackOverflowException in thread \"main\" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [#271]

I am using Hibernate and getting

开发者_StackOverflowException in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [#271]

What is pretty weird about this error is, that the object with the given id exists in the database. I inserted the problematic record in another run of the application. If I access it in the same run (i.e. same hibernate session) there seem to be no problems retrieving the data.

Just because it could be a fault of the mapping:

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;
}

I have absolutely no clue even where to look at. Any hints highly appreciated!

Just to clarify: The data was inserted in another RUN of the application. It is definitely in the database, as I can see it via an SQL-Query after the application terminated. And after THAT, i.e. when starting the application again, I get the error in the FIRST query of the database -- no deletion, no rollback involved.

Addition: Because it was asked, here is the code to fetch the data:

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

And just to make it complete, here is the generic code to insert it (before fetching in another RUN of the application):

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


Eureka, I found it!

The problem was the following:

The data in the table ThirdClass was not persisted correctly. Since this data was referenced from MyDbObject via

optional = false

Hibernate made an inner join, thus returning an empty result for the join. Because the data was there if executed in one session (in the cache I guess), that made no problems.

MySQL does not enforce foreign key integrity, thus not complaining upon insertion of corrupt data.

Solution: optional = true or correct insertion of the data.


Possible reasons:

  1. The row was inserted by the first session, but transaction was not committed when second session tried to access it.
  2. First session is roll-backed due to some reason.


Sounds like your transaction inserting is rollbacked


Main reason behind this issue is data mismatch, for example i have entity mapping class called "X" and it has column "column1" and it has reference to the table "Y" column "column1" as below

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

In this if X table column1 has value but Y table column1 is not having the value. Here link will be failed.

This is the reason we will get Hibernate objectNotFound exception

This issue can also be resolved by creating proper data model like creating proper indexing and constraints (primary key/foreign key) ..


This might be your case, kindly check my answer on another post.

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

I had the same Hibernate exception.

After debugging for sometime, i realized that the issue is caused by the Orphan child records.

As many are complaining, when they search the record it exists. What i realized is that the issue is not because of the existence of the record but hibernate not finding it in the table, rather it is due to the Orphan child records.

The records which have reference to the non-existing parents!

What i did is, find the Foreign Key references corresponding to the Table linked to the Bean.

To find foreign key references in SQL developer

1.Save the below XML code into a file (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.Add the USER DEFINED extension to SQL Developer

  • Tools > Preferences
  • Database > User Defined Extensions
  • Click "Add Row" button
  • In Type choose "EDITOR", Location - where you saved the xml file above
  • Click "Ok" then restart SQL Developer

    3.Navigate to any table and you will be able to see an additional tab next to SQL, labelled FK References, displaying FK information.

    4.Reference

  • http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html

  • How can I find which tables reference a given table in Oracle SQL Developer?

To find the Orphan records in all referred tables

select * from CHILD_TABLE where FOREIGNKEY not in (select PRIMARYKEY from PARENT_TABLE);

Delete these Orphan records, Commit the changes and restart the server if required.

This solved my exception. You may try the same.


Please update your hibernate configuration file as given below:

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


I have found that in Oracle this problem can also be caused by a permissions issue. The ProblemClass instance referred to by the MyDbObject instance may exist but have permissions that do not allow the current user to see it, even though the user can see the current MyDbObject.

0

精彩评论

暂无评论...
验证码 换一张
取 消