一尘不染

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

jsp

我有以下代码,尝试为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>

我在这里想念什么?


阅读 162

收藏
2020-06-10

共1个答案

一尘不染

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

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

2020-06-10