下面是我的oracle自动增长,为什么id会相差2,例如插入第一个id为2,第二个id就为4了,谢谢
create sequence SEQ_CCAR_ID minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 cache 20;
//建表
create table  factory_carSave//触发器
CREATE OR REPLACE TRIGGER carS
BEFORE INSERT ON factory_carSave FOR EACH ROW
BEGIN
SELECT SEQ_CCAR_ID.NEXTVAL INTO :NEW.id FROM DUAL;
END;
///hbm.xml
<class name="CarSave" table="factory_carSave">
<id column="ID" name="id" type="integer" >
<generator class="sequence">
<param name="sequence">SEQ_CCAR_ID</param>
</generator>
</id

解决方案 »

  1.   

    start with 1 increment by 1从以上可以看出递增是按1进行的.所以我觉得是否其他人在用这个序列呢?
    祝好运
      

  2.   

    只有我自己在使用,没有删除,一插到数据库我就select了,查出的第一个id是2,下一项id就是4了
      

  3.   

    start with 1 increment by 1
    就没有问题了
      

  4.   

    //触发器
    CREATE OR REPLACE TRIGGER carS
    BEFORE INSERT ON factory_carSave FOR EACH ROW
    BEGIN
    SELECT SEQ_CCAR_ID.NEXTVAL INTO :NEW.id FROM DUAL;
    END;
    ///hbm.xml
    <class name="CarSave" table="factory_carSave">
    <id column="ID" name="id" type="integer" >
    <generator class="sequence">
    <param name="sequence">SEQ_CCAR_ID</param>
    </generator>其实上,你同时使用了这两种方法取ID,在hibernate中定义了<param name="sequence">SEQ_CCAR_ID</param>,它在做insert时会.做SELECT SEQ_CCAR_ID.NEXTVAL得到一个+1的ID,而你又定义了TI,在TI里在次得到一个SELECT SEQ_CCAR_ID.NEXTVAL的ID为此变成+2
      

  5.   

    那照你的意思是不是触发器与hbm只需一个就可以了啊?我不用触发器生成的结果很怪第一个就很长的一串而不是1,不知道用触发器的话hbm该采用什么主键策略呢
      

  6.   

    我曾经做过一个测试,只用HIBERNATE 的列定义为'sequence'就能完成上面的功能,ID是连续的,也不会出来很怪的值,没用触发器。
      

  7.   

    我试了好几次不用触发器结果都是很怪,都是一长串的id,用了触发器就是+2,我用的ssh
      

  8.   

    你把能把控制台上的跟踪SQL打开吗?你可以看到在做insert前,都会来一个SELECT SEQ_CCAR_ID.NEXTVAL的,就是Hibernate自己来取新的ID,来当做新的ID来用,会不会是你的程序有问题,在获得到新的ID后,再做保存前又有什么语句对ID进行了修改?
      

  9.   

    下面是我自己的一个测试例子,没有用触发器:HBM的定义如下:
    <class name="com.yqTxl.db.table.Txl" table="TXL" schema="HR">
            <id name="id" type="java.lang.Integer">
                <column name="ID" precision="6" scale="0" />
                <generator class="sequence">
                 <param name="sequence">seq_txl</param> 
                </generator>
            </id>

    保存就直接把txl先定义好,直接调用
                    TxlDAO dao = new TxlDAO();
    dao.save(txl);
    其中txl.id  = -1 ;
    让HIBERNATE自己来帮我们修改id的值。
      

  10.   


    --可能是其他的对象使用了此序列,只有重新建个建个序列,货触发器
    下面是列子
    已连接。
    SQL> create table factory_carSave
      2  (id number,
      3  name varchar2(10),
      4  age number
      5  )
      6  /表已创建。SQL> create sequence SEQ_CCAR_ID
      2  minvalue 1
      3  maxvalue 100000000
      4  start with 1
      5  increment by 1
      6  cache 20
      7  /序列已创建。SQL> CREATE OR REPLACE TRIGGER carS
      2  BEFORE INSERT ON factory_carSave FOR EACH ROW
      3  BEGIN
      4  SELECT SEQ_CCAR_ID.NEXTVAL INTO :NEW.id FROM DUAL;
      5  END;
      6  /触发器已创建SQL> insert into factory_carSave(name) values('wkc');已创建 1 行。SQL> select * from factory_carSave;        ID NAME              AGE
    ---------- ---------- ----------
             1 wkc
      1* insert into factory_carSave(name,age) values('wkc168',23)
    SQL> /已创建 1 行。
    SQL> select * from factory_carSave;        ID NAME              AGE
    ---------- ---------- ----------
             1 wkc
             2 wkc168             23SQL> create table test as select * from factory_carSave where 1<>1;表已创建。SQL> insert into test values(SEQ_CCAR_ID.NEXTVAL,'wkc',23);已创建 1 行。SQL> select * from test;        ID NAME              AGE
    ---------- ---------- ----------
             3 wkc                23SQL> insert into factory_carSave(name,age) values('wkc128',23);已创建 1 行。SQL> select * from factory_carSave;        ID NAME              AGE
    ---------- ---------- ----------
             1 wkc
             2 wkc168             23
             4 wkc128             23
      

  11.   


    下面是我的saveCarSaveHibernateDAO.java
        public void save(CarSave carSave) {
    getHibernateTemplate().save(carSave);
    }
    CarSaveServiceImpl.java
       private CarSaveDAO carSaveDao;
       public void saveCarSave(CarSave carSave) {
    carSaveDao.save(carSave);
    }
    CarFormAction.java
        String carModel = request.getParameter("carModel");
    String price = request.getParameter("price");
    String text = request.getParameter("text");
    String carbrand = request.getParameter("carbrand");
    String index = request.getParameter("index");
    String car = request.getParameter("car"); carSave.setAddTime(new Date());
    carSave.setCarBrand(carbrand);
    carSave.setPrice(price);
    carSave.setCar(car);
    carSave.setCarModel(carModel);
    carSave.setOther(text);
    carSave.setIsIndex(index); this.carSaveService.saveCarSave(carSave);
      

  12.   

    我没用过SSH,你要不要这样子试试,直接在Java里定义一个main()来调用你的save脚本,并给你的ID随便指定一个值,把log4j的debug打开,跟踪一下如何?
      

  13.   

    不改其他的直接用insert插入可以,但是我用自己写的方法插入时却是加2,现在可以确定6楼说的是对的,但是我不知道该怎么修改啊,修改主键生成策略为什么???