tags:

views:

334

answers:

6

Hello all!

I am using Hibernate and getting

Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [<MyDbObject>#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);
}
+1  A: 

Sounds like your transaction inserting is rollbacked

Maurice Perry
Sorry for being unclear: 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 get the error in the first query of the database.
roesslerj
A: 

Or do you never commit the transaction?

Lars Andren
Also sorry for being unclear: 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 get the error in the first query of the database.
roesslerj
A: 

Possible reasons: a) The row was inserted by the first session, but transaction was not committed when second session tried to access it. b) First session is roll-backed due to some reason.

Thank you.

Sujee
Also sorry for being unclear: 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 get the error in the first query of the database.
roesslerj
+1  A: 

The code you use to fetch the Object might be useful. Maybe you are trying to fetch for a different id.

Andrei Fierbinteanu
Agreed. Turning on SQL logging in Hibernate and seeing what's really going on is probably helpful.
simon
Thank you very much, that was the hint into the right direction!
roesslerj
A: 

Are you accessing the same database? Do you have a second level cache enabled? Did you insert the record via Hibernate?

Pascal Thivent
Hello!Thank you for answering, I found the solution (see answer from me). Sadly I cannot accept my own answer immediately...
roesslerj
A: 

Heurreka, 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.

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

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

roesslerj
Use InnoDB tables...
Pascal Thivent