Hi
Loading an instance of a joined subclass after querying like this:
(NB this code assumes there is a SaleOrder with id=2, orderId=1)
Code:
Query q = session.createQuery( "FROM SaleOrder WHERE id=2 ");
SaleOrder s = ( SaleOrder ) q.iterate().next();
s.getId();
causes ObjectNotFoundException. The query generates the correct sql and returns a proxy but when getId() is called it gives exception shown below.
Exact same setup worked in hibernate 2. Hibernate appears to be treating id as the pk property.
If I rename id property to idd it works. Also If I use session.get() it returns a proxy (and works) or query.uniqueResult() (no proxy) it works.
From the docs:
"The special property (lowercase) id may be used to reference the identifier property of an entity provided that entity does not define a non-identifier property named id."
Am I doing something wrong?
Thanks,
Dominic.
Hibernate version:
version 3.2.5 (2007.07.31)
Mapping documents:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 1.1//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class
name="test.Order"
table="orders"
proxy="test.Order"
dynamic-update="false"
dynamic-insert="false"
>
<id
name="orderId"
column="order_id"
type="java.lang.Integer"
>
<generator class="identity">
</generator>
</id>
<joined-subclass
name="test.SaleOrder"
table="sale_orders"
dynamic-update="false"
dynamic-insert="false"
proxy="test.SaleOrder"
>
<key
column="order_id"
/>
<property
name="id"
type="java.lang.Integer"
update="false"
insert="false"
access="property"
>
<column
name="idd"
not-null="true"
sql-type="INT"
/>
</property>
</joined-subclass>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
Query q = session.createQuery( "FROM SaleOrder WHERE id=2 ");
SaleOrder s = ( SaleOrder ) q.iterate().next();
s.getId()
Full stack trace of any exception that occurs:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [test.SaleOrder#2]
at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at test.SaleOrder$$EnhancerByCGLIB$$e6914948.getId(<generated>)
at test.Test.testLoadSaleOrderByIdViaProxy(Test.java:46)
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:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
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)
Name and version of the database you are using:
MSSQL 2000
The generated SQL (show_sql=true):
select saleorder0_.idd as col_0_0_ from sale_orders saleorder0_ inner join orders saleorder0_1_ on saleorder0_.order_id=saleorder0_1_.order_id where saleorder0_.idd=2
select saleorder0_.order_id as order1_4_0_, saleorder0_.idd as idd5_0_ from sale_orders saleorder0_ inner join orders saleorder0_1_ on saleorder0_.order_id=saleorder0_1_.order_id where saleorder0_.order_id=?
Debug level Hibernate log excerpt:
on request