主键字段的Oracle序列不会检索Hibernate中当前插入的值

时间:2012-11-10 15:04:36

标签: oracle spring hibernate jsp oracle10g

我有以下代码尝试获取Oracle(10g)数据库中COUNTRY_ID表的主键列COUNTRY的生成序列值。

Country c=new Country();

c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);

session.flush();
//session.refresh(c);
System.out.println(c.getCountryId()); //Attempts to display the sequence value.
session.getTransaction().commit();     

此代码中的此语句System.out.println(c.getCountryId());尝试在插入完成后显示当前生成的序列值。

Oracle表中的序列生成值以<2>的多个插入,即类似414,416,418,420 ......而不是像414,415那样将它们插入链中, 416,417,418,419,420 ......

假设,Oracle表中当前插入的序列值为426,此语句System.out.println(c.getCountryId());显示425(而在Oracle表的COUNTRY_ID列中,插入的值为426)。

据推测,由于某些原因,序列似乎执行了两次


在我的Hibernate POJO中,我已将countryId主键列指定如下,

@Id
@Column(name = "COUNTRY_ID")
@SequenceGenerator(name = "CountryIdSequence", sequenceName = "COUNTRY_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CountryIdSequence")
private long countryId;

Country.hbm.xml映射文件中,此列countryId映射如下。

<id name="countryId" type="long">
  <column name="COUNTRY_ID" precision="35" scale="0"/>
  <generator class="sequence">
    <param name="sequence">COUNTRY_SEQ</param>
  </generator>
</id>

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我确实有一个针对COUNTRY表的触发器,该表由Oracle GUI工具自动创建,以将序列与主键列COUNTRY_ID相关联。

序列由Hibernate执行两次,再次由触发器执行。我暂时禁用了触发器,方法按预期工作。