Hibernate operation: Could not execute JDBC batch update;

caibaoying 2008-04-10 02:32:18
1:STRUTS+HIBERNATE+SPRING框架 原来项目的数据库是SQL2000,原来所有表是HIBERNATE生成的主键是用UUIX,现在改成ORACLE后随便运行一个保存测试用例的时候,会出现主键为空的异常.
也就是UUIX在ORACLE不生成,也就不能插入.如果重新在ORACLE的一张表上生成一个表 做保存的话 是没问题的.不可能在把原来的整个项目的表都去生成一遍,请问怎么改?

谢谢..异常如下:
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: Could not execute JDBC batch update; bad SQL grammar [insert into cms_cnparts.dbo.T_LINK (linkName, typeID, linkUrl, picture, linkIntro, createTime, email, tel, isPass, orderID, memberID, linkID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; nested exception is java.sql.BatchUpdateException: ORA-00926: missing VALUES keyword

Caused by: java.sql.BatchUpdateException: ORA-00926: missing VALUES keyword

at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)

HIBERNATE配置如下:
<session-factory>
<property name="dialect">
org.hibernate.dialect.OracleDialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@10.241.96.123:1521:ORA9I
</property>
<property name="connection.username">elplat</property>
<property name="connection.password">elplat_168</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="myeclipse.connection.profile">
cms_cnparts
</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>

/************************************
随便一张表的映射如下

<hibernate-mapping>
<class name="com.elone.pm.message.pojo.TLink" table="T_LINK" schema="dbo" catalog="cms_cnparts">
<id name="linkId" type="java.lang.String">
<column name="linkID" length="32" />
<generator class="uuid.hex" />
</id>
<property name="linkName" type="java.lang.String">
<column name="linkName" length="50" />
</property>
<many-to-one name="linktype" lazy="false" class="com.elone.pm.message.pojo.TLinktype" fetch="select">
<column name="typeID" length="32" />
</many-to-one>
<property name="linkUrl" type="java.lang.String">
<column name="linkUrl" length="200" />
</property>
<property name="picture" type="java.lang.String">
<column name="picture" length="2000" />
</property>
<property name="linkIntro" type="java.lang.String">
<column name="linkIntro" length="3000" />
</property>
<property name="createTime" type="java.lang.String">
<column name="createTime" length="80" />
</property>
<property name="email" type="java.lang.String">
<column name="email" length="50" />
</property>
<property name="tel" type="java.lang.String">
<column name="tel" length="50" />
</property>
<property name="isPass" type="java.lang.String">
<column name="isPass" length="8" />
</property>
<property name="orderId" type="java.lang.String">
<column name="orderID" length="8" />
</property>
<many-to-one name="member" lazy="false" class="com.elone.pm.message.pojo.TMember" fetch="select">
<column name="memberID" length="32" />
</many-to-one>
</class>
</hibernate-mapping>
...全文
3180 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuyanchao224 2011-04-22
  • 打赏
  • 举报
回复
我也遇到了,找了好久才发现时字段太小,而我添加的太大!!
XIDIAN_IT 2010-03-16
  • 打赏
  • 举报
回复
我今天也遇到了,是主键生成策略问题。
ankecheng 2008-04-10
  • 打赏
  • 举报
回复
我也遇到过,修改的方式和九楼的一样,把自动生成那个catalog属性去掉,有的时候这个属性是多余的,系统可能会认为映射文件的格式不正确
nanjg 2008-04-10
  • 打赏
  • 举报
回复
权限的事啊
caibaoying 2008-04-10
  • 打赏
  • 举报
回复
搞定啦````谢谢

java2000_net



因为Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog="***"(*表示数据库名称)这样的属性,将该属性删除就可以了

在SQL里面它会生成指定数据库,如

<hibernate-mapping>
<class name="com.elone.pm.message.pojo.TArticle" table="T_ARTICLE" schema="dbo" catalog="cms_cnparts">
<id name="articleId" type="java.lang.String">
<column name="articleID" length="32" />
<generator class="uuid.hex" />
</id>

把schema="dbo" catalog="cms_cnparts"去掉 改成ORACLE的指定模式table="T_UNITTYPE" schema="ELPLAT"前一个表 后一个用户跟你登陆系统的用户一样.
老紫竹 2008-04-10
  • 打赏
  • 举报
回复
你那么喜欢 native啊!为何不考虑 identity呢!

我给你一个样例,你自己修改吧!

<id name="id" type="long" column="person_id">
<generator class="sequence">
<param name="sequence">person_id_sequence</param>
</generator>
</id>


注意,此代码来自 hibernate 的自身的文档,我奇怪楼主难道不喜欢查文档或者到 google 搜索吗?
caibaoying 2008-04-10
  • 打赏
  • 举报
回复
<hibernate-mapping>
<class name="com.elone.pm.message.pojo.TLink" table="T_LINK" schema="dbo" catalog="cms_cnparts">
<id name="linkId" type="java.lang.String">
<column name="linkID" length="32"/>
<generator class="sequence">
<param name="sequence">seq_t_link</param>
</generator>
</id>

在ORACLE 建了个
CREATE SEQUENCE SEQ_t_link;

还是这个错


org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: Could not execute JDBC batch update; bad SQL grammar [insert into cms_cnparts.dbo.T_LINK (linkName, typeID, linkUrl, picture, linkIntro, createTime, email, tel, isPass, orderID, memberID, linkID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; nested exception is java.sql.BatchUpdateException: ORA-00926: missing VALUES keyword

Caused by: java.sql.BatchUpdateException: ORA-00926: missing VALUES keyword

at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:654)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:624)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:307)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:210)
at $Proxy4.saveTLink(Unknown Source)
at com.elone.pm.message.LinkManagerServiceTest.testSaveTLink(LinkManagerServiceTest.java:42)
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)

哎```笨死了偶`````
caibaoying 2008-04-10
  • 打赏
  • 举报
回复
我现在改成
<id name="linkId" type="java.lang.String">
<column name="linkID" length="32"/>
<generator class="native" />
</id>

了 然后在ORACLE 建了个
CREATE SEQUENCE SEQ_t_link;
在PLSQL上测试可以 自动增长
但是在项目 运行的时候 会出现
COULD NOT GET NEXT SEQUENCE VALUE
还是取不到值
老紫竹 2008-04-10
  • 打赏
  • 举报
回复
HIbernate主键详解------Identity
Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。
特点:与底层数据库有关,要求数据库支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。


HIbernate主键详解------Native
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。


我推荐用 identity

from:HIbernate主键详解
caibaoying 2008-04-10
  • 打赏
  • 举报
回复
是不是改这样
<id name="linkId" type="java.lang.String" unsaved-value="null">
<column name="linkID" length="32"/>
<generator class="native" />
</id>

然后ORACLE 写个触发器 自动增长
IamHades 2008-04-10
  • 打赏
  • 举报
回复
用native吧,采用数据库自己的主键策略
老紫竹 2008-04-10
  • 打赏
  • 举报
回复
oracle 可以用 identity 来解决,你需要自己制作一个Sequence 然后修改主键的配置就可以了!

唯一注意的,那个sequence的起始值,不能小于现有主键的最大值,呵呵!!
nanjg 2008-04-10
  • 打赏
  • 举报
回复
UUIX 为啥不native

81,087

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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