oracle主键用了自增,插入不了

org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [model.User]; SQL [insert into users (name) values (?) select scope_identity()]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [model.User]
org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:629)
org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)

users表两个字段id和name 主键用了触发器 insert into users(name) values('z') 可以插入
java代码不能插入
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>

哪错了?mysql没问题

JAVA代码里如果不显示提供主键值,自然是无法插入的。当然前提是你还得有自己的构造函数。
Hibernate设置的主键生成器,能在save(instance)时自动加上相关的主键值。自己直接写JAVA,目的就是要增强可控性(比如直接插入主键=10000000的记录),自然得手工提供主键值了,Hibernate可管不着。
你的触发器里面产生了主键值,可这个值没有参与insert操作,只是白白地让序列增长。追问

那怎么让他自动生成呢?代码插入数据的时候不管id

追答

如果用Hibernate,也不用触发器生成主键值吧。直接配置为自增长,并提供sequence名就可以了。如:

SEQ_RZB

用JAVA代码,则必须先获取sequence.nextval到变量中,再和其它属性数据一起new一个重载后的POJO类。之后调用HibernateBaseDAO的attachDirty()(好像是这个),进行保存。这里前提是刚刚获取的主键值没有被另一个人先行插入到表中。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-20
既然id是自增长,那么插入数据时候id列就不用显示给出
第2个回答  2019-01-18
oracle主键不能自增长,要通过序列的自增长来实现,先创建一个序列,序列的起始跟步长看你需要来设置,然后在插入的时候id列使用序列就可以了,oracle里面不懂用序列的话去搜一下相关资料
第3个回答  2012-02-20
oracle的自增 不是在外面自增然后插入的?追问

啥意思?sql:
create sequence user_sequence minvalue 1 nomaxvalue
increment by 1
start with 1;
create or replace trigger dectuser_user
before insert on users
for each row
begin
select user_sequence.nextval into :new.id from dual;
end;

追答

你的sql在oracle里能运行的通么

追问

能 ,insert into users(name) values('zhang')没问题

oracle主键用了自增,插入不了
JAVA代码里如果不显示提供主键值,自然是无法插入的。当然前提是你还得有自己的构造函数。Hibernate设置的主键生成器,能在save(instance)时自动加上相关的主键值。自己直接写JAVA,目的就是要增强可控性(比如直接插入主键=10000000的记录),自然得手工提供主键值了,Hibernate可管不着。你的触发器里面产生...

用oracle数据库增加一条数据记录的时候,主键 是设置自动获取的,增加其 ...
报这个错误就是明确的告诉你:Customer_id是主键,不允许为空,也没有设置为设置自动置值。你把建这个表的脚本(包含触发器)在这里贴出看看。肯定这里有问题。

oracle设置id自增,报ora-00955错误,代码如下:
估计是ID是保留字的原因。CREATE SEQUENCE seq_d_user Oracle的id自增方法:比如表名:tab,主键为:id 1. 增加一个序列号: create sequence seq_tab 2. 增加一个触发器,如果是insert,则取序列号值,赋予主键列 CREATE OR REPLACE TRIGGER TRI_tab BEFORE INSERT ONtabFOR EACH ROW DECLARE ...

oracle中如何设置主键并且让其自动增长
由于oracle中是没有自动增长的的,需要自己去进行写触发器等方式去进行设置:找了一下他人写的,有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。一、自增长主键我创建一个用户的信息表-- Create tablecreate table USERINFO( USERNO NUMBER not null, USERNAME NVARCHAR2(20), USE...

Oracle中SELECT TableName .nextval FROM DUAL 生成的主键怎么会是数据...
你可以先建一个序列 再建个触发器 触发器 create trigger 名 before insert on 表名 for each row begin select 序列名.nextval into :new.表列名 from dual;end 这样就OK了

为什么ORACLE中插入数据时出现错误?
手动插入数据报错:解决方法:1、使用sql查询主键的唯一约束当前最大值:select max(id) from table;(id为number类型)select max(to_number(id)) from table;(id为非number类型)2、使用sql查询该表的序列的下一个值 select SEQ.NEXTVAL from dual;(seq是对应表的序列名)3、最后使用PL\/SQL...

在Oracle 中设置自增列
在Oracle中使用序列和触发器实现自增列有一些需要注意的点。例如,插入指定ID值时,序列会从该值的下一个开始继续递增,但需要注意,如果序列值达到最大限制(如1000),且允许ID重复,则可能会出现值重复问题。如果将ID设置为主键,使用序列和触发器时,一旦序列值达到最大值,且不允许ID重复,插入数据...

oracle数据库,主键设置为ID,插入语句时,如何自动生成ID并让它顺序增加...
使用oracle数据库中的关键字sequence来实现目的。\/\/创建mySeq create sequence mySeqstart with 1increment by 2maxvalue 40minvalue 1cycle \/\/创建用户表 create table USER(Id int,CompName varchar2(20))插入语句可以这样写:insert into USER values(mySeq.nextVal,'AA')这样的话每次插入的ID就是...

oracle 如果存在主键则更新(update),否则添加新纪录(insert)怎么写...
可以用merge语句。给你举个例子 CREATE OR REPLACE PROCEDURE test (in_deptno IN NUMBER, in_dname IN VARCHAR2, in_loc IN VARCHAR2)AS t_record scott.dept%ROWTYPE;BEGIN SELECT in_deptno, in_dname, in_loc INTO t_record FROM DUAL;---用merge语句 MERGE I...

oracle的主键要设置默认值为自动递增,怎么处理?
Oracle 不直接支持 自动递增的列。需要创建一个序列 SEQUENCE。又由于无法在列的默认值那里,设置默认值为序列。因此只能通过触发器来设置。设置好触发器以后,所有的插入语句,将忽略外部传入的 id 数据,只使用指定的序列号来产生。SQL> CREATE SEQUENCE test_sequence2 2 increment by 1 -- 每...

相似回答