使用hibernate插入一条记录以后需要返回该记录的ID,ID采用oracle10g的自增长。下面是关键代码。问题描述:举例来说方便点。数据库里面最大的用到的ID是100了,这时候插入,正常情况数据库记录的ID应该是101,下面方法返回的也是101,可是数据库插入的记录ID是102,方法返回的的101请高手解惑。 public Integer saveZjsb(Zjsb transientInstance) {
log.debug("saving Zjsb instance");
int id = 0;
try {
getSession().save(transientInstance);
getSession().flush();
id = transientInstance.getId();
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
return id;
}没分了,见谅。

解决方案 »

  1.   

    把你Zjsb.hbm.xml配置文件贴出来 
      

  2.   

    Zjsb.hbm.xml配置文件如下
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!--
    Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping package="com.firstssh.model">
    <class name="Zjsb" table="BZZL_ZJSB" schema="BZZL_ZJSB">
    <id name="id" type="java.lang.Integer">
    <column name="ID" precision="9" scale="0" />
    <generator class="sequence">
    <param name="sequence">BZZL_ZJSB_SEQ</param>
    </generator>
    </id>
    <property name="sqlx" type="java.lang.String">
    <column name="SQLX" length="10"/>
    </property>
    <property name="xmlbid" type="java.lang.String">
    <column name="XMLBID" length="10" />
    </property>
    <property name="slbh" type="java.lang.String">
    <column name="SLBH" length="20" />
    </property>
    <property name="projectNm" type="java.lang.String">
    <column name="PROJECT_NM" length="500" not-null="true" />
    </property>
    <property name="organCd" type="java.lang.String">
    <column name="ORGAN_CD" length="9" not-null="true" />
    </property>
    <property name="organNm" type="java.lang.String">
    <column name="ORGAN_NM" length="120" />
    </property>
    <property name="sbyj" type="java.lang.String">
    <column name="SBYJ" length="4000" not-null="true" />
    </property>
    <property name="tbrq" type="java.util.Date">
    <column name="TBRQ" length="7" />
    </property>
    <property name="status" type="java.lang.String">
    <column name="STATUS" length="10" />
    </property>
    <property name="bz" type="java.lang.String">
    <column name="BZ" length="1000" />
    </property>
    <property name="clsj" type="java.util.Date">
    <column name="CLSJ" length="7" />
    </property>
    <property name="sqclurl" type="java.lang.String">
    <column name="SQCLURL" length="2000" />
    </property>
    <property name="fjurl" type="java.lang.String">
    <column name="FJURL" length="2000" />
    </property>
    <property name="fjurl2" type="java.lang.String">
    <column name="FJURL2" length="2000" />
    </property>
    </class>
    </hibernate-mapping>
      

  3.   

    问题解决了。我把oracle的trgger去掉了。不太了解hibernate的主键生成机制,不知道并发访问的时候这样做返回的ID是不是正确的。可能2个人同时插入数据时候返回的ID有一个人就不对了。hibernater可能是select ***seq.next from dual..... 类似的方法的返回主键的。暂时顾不了这么多。
      

  4.   

    getSession().save(transientInstance); 
    getSession().flush(); 
    id = transientInstance.getId(); 你这段代码就有问题了,getSession().save(transientInstance); 执行这的时候按照hibernate的原理transientInstance实例 transientInstance.getId() 应该是空的。但是你能获得此处的id?那你还用hibernate的sequence来自动增长id做什么?不知你是否明白
    若这点道理还不清楚的话建议楼主去看点hibernate的书。
      

  5.   

    楼上的
    getSession().save(transientInstance); 
    提交之前transientInstance.getId() 为空没错。提交之后你再看看
    transientInstance.getId()还为空吗?
    hibernate已经帮你把ID都set进去了