Hibernate的问题,搞不定了,请教各位!

winzhen 2004-06-20 11:04:40
错误:读取数据时,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,一样报错误。

不知道产生这个问题的原因是什么,该怎么解决这个问题?
...全文
195 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gong1 2004-07-02
  • 打赏
  • 举报
回复
同意楼上。
^_^
bluemeteor 2004-07-02
  • 打赏
  • 举报
回复
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=1

把这段sql在SQL PLUS里面执行一下看看有没有问题

另 如果你的id属性在class文件中都是Long类型的

那么在xml文件中的id字段声明要加上 type="java.lang.Long"
for example

<id name="id">
<column name="id"/>
<generator class="sequence"/>
</id>

改为

<id
name="id"
column="id"
type="java.lang.Long"
unsaved-value="null" //这句最好也加上 hibernate判断对象操作的依据
>
<generator class="sequence"/>
</id>

建议楼主仔细看看hibernate的文档
http://www.hibernate.org.cn/hibernate-ref/
CsdnRob 2004-07-02
  • 打赏
  • 举报
回复
up
minghuitian 2004-06-24
  • 打赏
  • 举报
回复
up
chenhaipeng 2004-06-24
  • 打赏
  • 举报
回复
<class name="demo.object.exam1.Author" table="author" >
把下面这段:
<!-- 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>
改为:
<!-- 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" />
</class>
注意many-to-many的关系只在一个地方建就可以了.
winzhen 2004-06-21
  • 打赏
  • 举报
回复
re
winzhen 2004-06-21
  • 打赏
  • 举报
回复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧