Need help with Hibernate? Read this first:
Hibernate version: Hibernate 3.1 beta 2
Mapping documents:
Code:
<class name="Employment">
<id name="employmentId" unsaved-value="0" column="empid">
<generator class="increment"/>
</id>
<many-to-one name="employee" not-null="true" update="false"/>
<many-to-one name="employer" not-null="true" update="false"/>
<property name="startDate" not-null="true" update="false" insert="false"/>
<property name="endDate" insert="false"/>
<property name="regionCode" update="false"/>
<property name="salary" type="org.hibernate.test.sql.MonetaryAmountUserType">
<column name="VALUE" sql-type="float"/>
<column name="CURRENCY"/>
</property>
<loader query-ref="employment"/>
<sql-insert>
INSERT INTO EMPLOYMENT
(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID)
VALUES (?, ?, CURRENT_DATE, UPPER(?), ?, ?, ?)
</sql-insert>
<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update>
<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete>
</class>
<sql-query name="employment">
<return alias="emp" class="Employment"/>
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
FROM EMPLOYMENT
WHERE EMPID = ?
</sql-query>
Code between sessionFactory.openSession() and session.close():Code:
public void testGetEmployment(){
if ( getDialect() instanceof DB2Dialect ) return; //DB2 no like upper(?)
Session s = openSession();
Transaction t = s.beginTransaction();
Organization ifa = new Organization("IFA");
Organization jboss = new Organization("JBoss");
Person gavin = new Person("Gavin");
Employment emp = new Employment(gavin, jboss, "AU");
s.save(ifa);
s.save(jboss);
s.save(gavin);
Serializable empId = s.save(emp);
t.commit();
s.close();
getSessions().evict(Organization.class);
getSessions().evict(Person.class);
getSessions().evict(Employment.class);
s = openSession();
t = s.beginTransaction();
emp = (Employment) s.get(Employment.class, empId);
s.delete(emp);
s.delete(gavin);
s.delete(ifa);
s.delete(jboss);
t.commit();
s.close();
}
Full stack trace of any exception that occurs:Code:
15:54:48,140 DEBUG SQL:344 -
SELECT
EMPLOYEE AS employee2_0_,
EMPLOYER AS employer2_0_,
STARTDATE AS startDate2_0_,
ENDDATE AS endDate2_0_,
REGIONCODE as regionCode2_0_,
EMPID AS empid2_0_
FROM
EMPLOYMENT
WHERE
EMPID = ?
Hibernate:
SELECT
EMPLOYEE AS employee2_0_,
EMPLOYER AS employer2_0_,
STARTDATE AS startDate2_0_,
ENDDATE AS endDate2_0_,
REGIONCODE as regionCode2_0_,
EMPID AS empid2_0_
FROM
EMPLOYMENT
WHERE
EMPID = ?
15:54:48,156 DEBUG LongType:60 - binding '1' to parameter: 1
15:54:48,156 DEBUG LongType:87 - returning '1' as column: empid2_0_
15:54:48,172 DEBUG LongType:87 - returning '1' as column: employee2_0_
15:54:48,172 DEBUG LongType:87 - returning '2' as column: employer2_0_
15:54:48,187 DEBUG TimestampType:87 - returning '2005-09-05 13:49:43' as column: startDate2_0_
15:54:48,187 DEBUG TimestampType:81 - returning null as column: endDate2_0_
15:54:48,187 DEBUG StringType:87 - returning 'AU' as column: regionCode2_0_
15:54:48,219 WARN JDBCExceptionReporter:71 - SQL Error: 17006, SQLState: null
15:54:48,219 ERROR JDBCExceptionReporter:72 - Invalid column name
15:54:48,219 INFO DefaultLoadEventListener:95 - Error performing load command
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:70)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2150)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2026)
at org.hibernate.loader.Loader.list(Loader.java:2021)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:109)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1537)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:165)
at org.hibernate.persister.entity.NamedQueryLoader.load(NamedQueryLoader.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2705)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:774)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:714)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:707)
at org.hibernate.test.sql.SQLTest.testGetEmployment(SQLTest.java:58)
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 org.hibernate.test.TestCase.runTest(TestCase.java:140)
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.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: Invalid column name
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)
at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:3060)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1861)
at oracle.jdbc.driver.OracleResultSet.getBigDecimal(OracleResultSet.java:2086)
at org.hibernate.test.sql.MonetaryAmountUserType.nullSafeGet(MonetaryAmountUserType.java:46)
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:104)
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:1884)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1372)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1300)
at org.hibernate.loader.Loader.getRow(Loader.java:1197)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:223)
at org.hibernate.loader.Loader.doList(Loader.java:2147)
... 32 more
Name and version of the database you are using:INFO SettingsFactory:77 - RDBMS: Oracle, version: Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
INFO SettingsFactory:78 - JDBC driver: Oracle JDBC driver, version: 10.1.0.3.0
INFO Dialect:100 - Using dialect: org.hibernate.dialect.Oracle9Dialect
I played with SQLQuery examples from $Hibernate_Home/test/org/hibernate/test/sql
And got this error
I saw this line
Code:
at org.hibernate.test.sql.MonetaryAmountUserType.nullSafeGet(MonetaryAmountUserType.java:46)
and changed
sql-query name="employment" to
Code:
<sql-query name="employment">
<return alias="emp" class="Employment">
<return-property name="salary">
<return-column name="VALUE"/>
<return-column name="CURRENCY"/>
</return-property>
</return>
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
FROM EMPLOYMENT
WHERE EMPID = ?
</sql-query>
Employment was successfuly got.
Why Hibernate want to load
Employment.salary though it is not required?