謝謝大家,現在又報這個錯誤了???? Hibernate: select hibernate_sequence.nextval from dual org.hibernate.exception.SQLGrammarException: could not get next sequence valueCaused by: java.sql.SQLException: ORA-02289: sequence does not exist at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:184) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:241) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1477) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:677) at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2243) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2462) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:435) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:375) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93) at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75) ... 35 more
这是说取不到序列值,将ID改回ASSIGNED,自己分配一个吧
主鍵生成方式不是 sequence 啊!
我的主鍵式userid, 是不是必須補滿8位?????????????????????
現在發現 如果 主键模式:assigned 不會報錯,但是不會insert into 如果是:native ,就會有上面的報錯 .我隱約感覺到我可能犯了大錯了!!!!!!!!!!! 大家议一议
could not get next sequence value需要在hbm.xml文件中配置id主键生成为sequence并确保数据库中有对应id的序列
同意,比如,你可以在save之后,马上读取出来看看
log.debug("saving Cusert instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}我只是調用這個方法. 數據保存不進! 我採用debug 模式進行調試,Cusert 對象不是空的,而且this.getCusertDao.save(cusert)方法能夠執行下去,但是
我立即進行查詢 發現cusert 變成空的了! 後來我直接在青蛙(toad) 進行insert into 發現能夠實現!我主鍵設成 assigned .
1 把dao的某个属性设置为一个好看的字符串,比如############, 执行后看看数据库是不是有这个字段
2 把hibernate的 show_sql 打开,看看数据库是不是执行了 insert
是否做了关联!主键模式:assigned比如你把 char(20)类型的字段映射为id,id主键生成模式是assigned,
当你保存记录的时候,若Key不到20位,你必须把key补满20位,
否则会失败的
fno uname 不是空的
cusert = this.cusertImpl.creteNewuer(fno, fno, "BDS", uname);//創建一個新的用戶try{
this.cusertImpl.saveCusert(cusert);//保存到數據庫
}catch(Exception e){e.printStackTrace();}CusertImpl 類:
public Cusert creteNewuer(String userid, String upwd, String rid, String uname){
return new Cusert(userid,upwd,rid,uname);//初始化這個用戶對象
}Cusert 類:
public class Cusert extends AbstractCusert implements java.io.Serializable { private static final long serialVersionUID = 1L;
public Cusert() {
}
public Cusert(String userid, String upwd, String rid, String uname) {
super(userid, upwd, rid, uname); }}AbstractCusert 類:
public abstract class AbstractCusert implements java.io.Serializable {
private String userid;
private String upwd;
private String rid;
private String uname; public AbstractCusert() {
} public AbstractCusert(String userid, String upwd, String rid, String uname) {
this.userid = userid;
this.upwd = upwd;
this.rid = rid;
this.uname = uname;
}
---get set 方法略---
}Cusert.hbm.xml 文件:
<hibernate-mapping>
<class name="com.nb.po.Cusert" table="CUSERT" schema="NB">
<id name="userid" type="java.lang.String">
<column name="USERID" length="8" />
<generator class="native" />//原來是Assigned 修改了一下
</id>
<property name="upwd" type="java.lang.String">
<column name="UPWD" length="10" not-null="true" />
</property>
<property name="rid" type="java.lang.String">
<column name="RID" length="3" not-null="true" />
</property>
<property name="uname" type="java.lang.String">
<column name="UNAME" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
native要求数据列的类型的long,short,int.(好像没有记错,我去查一下书,呵)你应当把表的设置修改成int的
如果影响大的话,还使用assigned ,不过要自己行设置ID值
而三种主键生成器要求的数据类型应为long,short,int你自己看着办吧!开饭了!
Hibernate: select hibernate_sequence.nextval from dual
org.hibernate.exception.SQLGrammarException: could not get next sequence valueCaused by: java.sql.SQLException: ORA-02289: sequence does not exist at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:184)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:241)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1477)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:677)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2243)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2462)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:435)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:375)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
... 35 more
assigned主键生成器,要求自己设置主键值
通过
<column name="USERID" length="8" />
8位的字符型
assigned主键是自己负值的
save除了 插入新值,和更新纪录外还有什么问题?还是不懂,能否把具体原因发E-mail给我?
谢谢
[email protected]