当前位置: 代码迷 >> J2EE >> Hibernate:save()后获取oracle 从增主键和数据生成的逐渐不一致
  详细解决方案

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

热度:258   发布时间:2016-04-22 00:34:18.0
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
  相关解决方案