[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-2341) ObjectNotFoundException on session.get() on non-existent object

Timo Thomas (JIRA) noreply at atlassian.com
Fri Jan 19 07:34:44 EST 2007


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2341?page=all ]

Timo Thomas updated HHH-2341:
-----------------------------

    Attachment: TestHibernateCascade.zip

Is there any action on this issue?

I provided the test case in source for easier debugging. 

> ObjectNotFoundException on session.get() on non-existent object
> ---------------------------------------------------------------
>
>          Key: HHH-2341
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2341
>      Project: Hibernate3
>         Type: Bug

>   Components: core
>     Versions: 3.2.1
>  Environment: HSQLDB 1.8.0
>     Reporter: Timo Thomas
>  Attachments: TestHibernateCascade.zip
>
>
> Hibernate version:
> 3.2.1 GA (same for hibernate-annotations)
> Mapping documents:
> Parent.java (omitting package and some import declarations)
> import javax.persistence.*;
> @Entity   
> public class Parent {
>    public Integer id;
>    public Set<Child> children = new HashSet<Child>();
>    @Id
>    @GeneratedValue(strategy = GenerationType.AUTO)
>    public Integer getId() {
>       return id;
>    }
>    public void setId(Integer id) {
>       this.id = id;
>    }
>    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
>    public Set<Child> getChildren() {
>       return children;
>    }
>    public void setChildren(Set<Child> children) {
>       this.children = children;
>    }
> }
> Child.java (omitting package and some import declarations)
> import javax.persistence.*;
> @Entity
> public class Child {
>    public Integer id;
>    public Parent parent;
>    
>    @Id
>    @GeneratedValue(strategy = GenerationType.AUTO)
>    public Integer getId() {
>       return id;
>    }
>    public void setId(Integer id) {
>       this.id = id;
>    }
>    @ManyToOne(optional = false)
>    @JoinColumn(name = "parent_fk")
>    public Parent getParent() {
>       return parent;
>    }
>    public void setParent(Parent parent) {
>       this.parent = parent;
>    }
> }
> Code between sessionFactory.openSession() and session.close():
>        Transaction transaction = session.beginTransaction();
>        
>        Parent parent = new Parent();
>        parent.setName("p1");
>        session.persist(parent);
>        assertNotNull(parent.getId());
>        Integer parentId = parent.getId();
>        Child child = new Child();
>        child.setName("c1");
>        child.setParent(parent);
>        parent.getChildren().add(child);
>        session.persist(parent);
>        assertNotNull(child.getId());
>        Integer childId = child.getId();
>        transaction.commit();
>        session.close();
>        ///////////////////////////////////////////
>        session = sessionFactory.openSession();
>        transaction = session.beginTransaction();
>        
>        parent = (Parent) session.load(Parent.class, parentId);
>        child = (Child) session.load(Child.class, childId);
> //       child = (Child) session.get(Child.class, childId);
>        session.delete(parent);
> //       session.flush();   // !! required if session&transaction is re-opened and child is obtained with load(), otherwise exception on next line - BUG ?
>        child = (Child) session.get(Child.class, childId);
> Full stack trace of any exception that occurs:
> org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [model.Child#1]
>    at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:375)
>    at org.hibernate.event.def.DefaultLoadEventListener.returnNarrowedProxy(DefaultLoadEventListener.java:223)
>    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:187)
>    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
>    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
>    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
>    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
>    at test.CascadeAnnotationTest.testBug(CascadeAnnotationTest.java:48)
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>    at java.lang.reflect.Method.invoke(Method.java:585)
>    at junit.framework.TestCase.runTest(TestCase.java:164)
>    at junit.framework.TestCase.runBare(TestCase.java:130)
>    at junit.framework.TestResult$1.protect(TestResult.java:110)
>    at junit.framework.TestResult.runProtected(TestResult.java:128)
>    at junit.framework.TestResult.run(TestResult.java:113)
>    at junit.framework.TestCase.run(TestCase.java:120)
>    at junit.framework.TestSuite.runTest(TestSuite.java:228)
>    at junit.framework.TestSuite.run(TestSuite.java:223)
>    at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
>    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
>    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> The generated SQL (show_sql=true):
> Hibernate: insert into Parent (id, name) values (null, ?)
> Hibernate: call identity()
> Hibernate: insert into Child (id, name, parent_fk) values (null, ?, ?)
> Hibernate: call identity()
> Hibernate: select parent0_.id as id0_0_, parent0_.name as name0_0_ from Parent parent0_ where parent0_.id=?
> Hibernate: select children0_.parent_fk as parent3_1_, children0_.id as id1_, children0_.id as id1_0_, children0_.name as name1_0_, children0_.parent_fk as parent3_1_0_ from Child children0_ where children0_.parent_fk=?
> Why is this exception thrown under these circumstances? Am I using the API in an undocumented/disallowed way? If yes, where exactly? 
> The Hibernate API doc says, that Session.get() returns null if an object can't be found. No exception should be thrown.
> However, Session.get() at the end of sample code does return null as expected, if either
> a) Session.get() is used instead of load() some lines above (see commented line)
> b) the transaction and the session is isn't closed or reopened, respectively
> c) Session.flush() is called before the final call to Session.get()
> I'd like to understand why Hibernate behaves like this, which I presume is erroneous. I'm a beginner in Hibernate, but I couldn't get any help in the forum.
> Timo

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list