Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

hibernate

I am using Hibernate and getting

Exception 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); } 
like image 280
roesslerj Avatar asked May 17 '10 07:05

roesslerj


1 Answers

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.

like image 175
roesslerj Avatar answered Sep 19 '22 12:09

roesslerj