1

我有以下代码尝试为我的 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(而在COUNTRY_IDOracle表的列中,插入的值为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>

我在这里想念什么?

4

1 回答 1

0

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

The sequence was being executed twice once by Hibernate and again by the trigger. I disabled the trigger temporarily and the approach worked as intended.

于 2014-10-09T18:48:29.040 回答