日期:2014-05-19  浏览次数:20807 次

Hibernate:save()后获取oracle 自增主键和数据生成的逐渐不一致
Java code

public boolean save(Cardownerinfo ownerinfo) {
        Session session = HibernateSessionFactory.getSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(ownerinfo);
            tx.commit();
            return true;
        } catch (RuntimeException re) {
            tx.rollback();
            log.error("==CardownerinfoSevices save failed==", re);
            re.printStackTrace();
        } finally {
            session.close();
        }
        return false;
    }



测试方法:
Java code

public void testSave() {
        Cardownerinfo ownerinfo = new Cardownerinfo();
        ownerinfo.setOwnername("人卡465");
        ownerinfo.setCreatetime(new Date());
        CardownerinfoSevices ownerinfoSer = new CardownerinfoSevices();
        boolean save = ownerinfoSer.save(ownerinfo);
        if (save) {
            System.out.println(ownerinfo.getOwnerid());
            System.out.println("successfuly");
        } else {
            System.out.println("failed");
        }
    }



输出结果:

109
successfuly

用MyEclipse 的debug看出自增主键也是109
然后在数据库中查询发现生成的记录是
110 人卡465

oracle数据库中的生成的记录基数都是2
oracle 序列:
SQL code

CREATE SEQUENCE  "TYZHUSER"."CARDOWNERINFO_S"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 121 CACHE 20 ORDER  NOCYCLE 



为什么hibenrate是加一,而oracle是加2?


------解决方案--------------------
我知道你主键生成策略是seq 请你把我上面的答案再看一遍 触发seq的nextVal的方式不一定非得是保存数据 只要Hibernate使用了保存方法肯定就会调用他一次

另外 好象Hibernate能设置seq的跨度是多少吧..
------解决方案--------------------
学习了..
------解决方案--------------------
是不是Transaction 在搞怪。设置为autocommit(true)试试 如果是这个问题 那么实际出入的值是多少由于并发性的影响就不好判断了 本身就一个语句 成功与否不用rollback吧。 可以讲事物去掉试试
------解决方案--------------------
学习了······
------解决方案--------------------
帮楼主顶起,自己也学习下。
------解决方案--------------------
探讨
引用:
我没看到你的主键生成策略 另外 LZ需要注意一点 数据未保存但是seq却自增了说明有条数据没保存但是却调用了主键生成策略(类似事务没提交 不过看LZ代码我不知道有没有问题 可能保存方法执行两次 最后一次事务提交) 只是猜测

策略:

Java code

CREATE SEQUENCE"TYZHUSER"."CARDOWNERINFO_S" MINVALUE1 MAXVALUE999999999999999999999999999 INCREMENT BY1 START WITH121 CACHE20 ORDER NOCYCLE

可能是我说的不清楚,不是数据未保存,squences 却自增了

是这样的情况,代码是上面的,假如最后一条记录是150
我写sql语句,insert那么这条记录为151,

但是我用save方法,这条记录却变成了153
取对象的主键为152




------解决方案--------------------

可能和主键生成策略有关吧
------解决方案--------------------
学习一下,hibernate