hibenate+oracle报错:could not get next sequence value

LoginOut 2009-07-08 09:38:07
在sql*plus 下执行语句:insert into userinfo(userid,username,userpw) values(105,'a','b');
commit后数据可以插入到数据库

xml:

<id name="userid" type="java.lang.Long">
<column name="USERID" precision="22" scale="0" />
<generator class="native" />
</id>

在Hibernate中save

public void testSave(){
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
Userinfo user=new Userinfo();
user.setUserid(new Long(104));
user.setUsername("张三");
user.setUserpw("helo");
user.setUserphone("13800138000");
session.save(user);
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
}


程序报错:

Hibernate: select hibernate_sequence.nextval from dual
09:25:23,937 WARN JDBCExceptionReporter:77 - SQL Error: 2289, SQLState: 42000
09:25:23,937 ERROR JDBCExceptionReporter:78 - ORA-02289: 序列不存在

org.hibernate.exception.SQLGrammarException: could not get next sequence value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at telezone.entity.UserInfoTest.testSave(UserInfoTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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 org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
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)
Caused by: java.sql.SQLException: ORA-02289: 序列不存在

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:796)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1031)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:836)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
... 26 more



但是我的这个userInfo表根本就没有创建序列啊,主键userid是自动分配的,为什么还会报出这样的错误?
...全文
17981 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
坦然处之 2012-07-09
  • 打赏
  • 举报
回复
六楼V5,困扰我好久的问题啊,终于解决了
lunweiwww 2012-07-09
  • 打赏
  • 举报
回复
我今天也遇到这个问题……
forever小菜 2012-07-02
  • 打赏
  • 举报
回复
领教了,新手,多学习
qingxin133 2012-04-28
  • 打赏
  • 举报
回复
5楼正解
laughing_eng 2012-04-20
  • 打赏
  • 举报
回复
哪楼是正解呢
xuezhonghong 2011-07-29
  • 打赏
  • 举报
回复
windylel 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 loginout 的回复:]

引用 4 楼 fantasy2436 的回复:
native在ORACLE當中貌似就是使用SEQUENCE啊,所以你用自己指定的id直接插入,肯定錯誤了。
建議修改
<generator class="native" />

<generator class="sequence">
<param name="sequence">S_USER </param>
</generato……
[/Quote]

你改变了我的一生。。。。我困扰好久了,哈哈哈
SunHaoLi1988 2010-04-12
  • 打赏
  • 举报
回复
受教了,顶起!!!!
LoginOut 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fantasy2436 的回复:]
native在ORACLE當中貌似就是使用SEQUENCE啊,所以你用自己指定的id直接插入,肯定錯誤了。
建議修改
<generator class="native" />

<generator class="sequence">
<param name="sequence">S_USER </param>
</generator>
還需要在數據庫中創建一個名為S_USER的sequence即可。

[/Quote]
网上有说,oracle中native也是用sequence,
oracle下用native需要用到一个叫hibernate_sequence的sequence
在oracle中建立和hibernate_sequence的sequence就成了

但是这些我都用不上,一开始我的思路就错了,我是想手动分配,所以应该是用assigned
而非native
kaynezhang 2009-07-08
  • 打赏
  • 举报
回复
hibernate连接oracle有两种方式,一种是制定sequence的名字 如:
< id name="id" column="ID"> < generator class="sequence"> < param name="sequence">DEPARTMENT_ID_SEQ< /param> < /generator> < /id>

如果要使用native,则必须创建名为HIBERNATE_SEQUENCE 的sequence
CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999
< id name="id" column="ID"> < generator class="native" /> < /id>
fantasy2436 2009-07-08
  • 打赏
  • 举报
回复
native在ORACLE當中貌似就是使用SEQUENCE啊,所以你用自己指定的id直接插入,肯定錯誤了。
建議修改
<generator class="native" />

<generator class="sequence">
<param name="sequence">S_USER</param>
</generator>
還需要在數據庫中創建一個名為S_USER的sequence即可。




flyxxxxx 2009-07-08
  • 打赏
  • 举报
回复
你要先在数据库默认的id生成序列中加一个值才行
sangshusen_1988 2009-07-08
  • 打赏
  • 举报
回复
配置下自动更新表结构看看
a115599000 2009-07-08
  • 打赏
  • 举报
回复
标记~~~~~

67,515

社区成员

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

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