Hibernate的问题,搞不定了,请教各位!
错误:读取数据时,SQL 命令未正确结束!
使用hibernate:2.1,数据库Oracle
三个对象映射:Person和Author之间是One to One,Author和Work之间是Many to Many。
映射文件:
<hibernate-mapping>
<class name="demo.object.exam1.Person" table="person">
<id name="id">
<column name="id"/>
<generator class="sequence"/>
</id>
<property name="name" column="name" />
<property name="email" column="email" />
<component name="name1" class="demo.object.exam1.Name">
<property name="initialname"/>
<property name="first"/>
<property name="last"/>
</component>
</class>
<class name="demo.object.exam1.Author" table="author" >
<id name="aid" column="aid">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="alias" column="alias" />
<one-to-one name="person" class="demo.object.exam1.Person" cascade="all" constrained="true" />
<set name="works" table="author_work" inverse="false">
<key column="author_id"/>
<many-to-many column="work_id" class="demo.object.exam1.Work" outer-join="false" />
</set>
</class>
<!-- many to many -->
<class name="demo.object.exam1.Work" table="work" >
<id name="id" column="id">
<generator class="uuid.hex"/>
</id>
<property name="title" column="title" />
<set name="authors" table="author_work" inverse="true">
<key column="work_id"/>
<many-to-many column="author_id" class="demo.object.exam1.Author"/>
</set>
</class>
</hibernate-mapping>
下列代码出错:
session.load(Author.class,new Long(1));
错误代码如下:
01:03:41,015 DEBUG SessionImpl:1915 - loading [demo.object.exam1.Author#1]
01:03:41,015 DEBUG SessionImpl:2012 - attempting to resolve [demo.object.exam1.Author#1]
01:03:41,109 DEBUG SessionImpl:2045 - object not resolved in any cache [demo.object.exam1.Author#1]
01:03:41,109 DEBUG EntityPersister:417 - Materializing entity: [demo.object.exam1.Author#1]
01:03:41,125 DEBUG BatcherImpl:192 - about to open: 0 open PreparedStatements, 0 open ResultSets
01:03:41,140 DEBUG BatcherImpl:226 - prepared statement get: select author0_.aid as aid1_, author0_.alias as alias1_, person1_.id as id0_, person1_.name as name0_, person1_.email as email0_, person1_.initialname as initialn4_0_, person1_.first as first0_, person1_.last as last0_ from author author0_ left outer join person person1_ on author0_.aid=person1_.id where author0_.aid=?
Hibernate: select author0_.aid as aid1_, author0_.alias as alias1_, person1_.id as id0_, person1_.name as name0_, person1_.email as email0_, person1_.initialname as initialn4_0_, person1_.first as first0_, person1_.last as last0_ from author author0_ left outer join person person1_ on author0_.aid=person1_.id where author0_.aid=?
01:03:41,140 DEBUG BatcherImpl:232 - preparing statement
01:03:41,578 DEBUG JDBCExceptionReporter:36 - SQL Exception
java.sql.SQLException: ORA-00933: SQL 命令未正确结束
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:643)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1674)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1870)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:363)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:314)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:205)
at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:83)
at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:790)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:184)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:128)
at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:826)
at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:846)
at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:57)
at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:49)
at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:420)
at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:2046)
at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:1920)
at net.sf.hibernate.impl.SessionImpl.load(SessionImpl.java:1849)
at org.springframework.orm.hibernate.HibernateTemplate$3.doInHibernate(HibernateTemplate.java:198)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:150)
at org.springframework.orm.hibernate.HibernateTemplate.load(HibernateTemplate.java:196)
at demo.dao.support.SpringBasedDao.loadObject(SpringBasedDao.java:71)
at demo.service.support.DataServiceSpring$7.doInTransactionWithoutResult(DataServiceSpring.java:298)
at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:33)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:116)
at demo.service.support.DataServiceSpring.delManytoMany(DataServiceSpring.java:295)
at demo.TestExamObject.main(TestExamObject.java:23)
01:03:41,593 WARN JDBCExceptionReporter:38 - SQL Error: 933, SQLState: 42000
01:03:41,593 ERROR JDBCExceptionReporter:46 - ORA-00933: SQL 命令未正确结束
我看这个错误好像是sql语句的问题,但是sql语句是hibernate自动产生的,如果去掉outer join,Hibernate又会使用inner join,一样报错误。
不知道产生这个问题的原因是什么,该怎么解决这个问题?