roesslerj roesslerj - 23 days ago 11
Java Question

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

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

Answer

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.

Comments