对于一个主键字段甲骨文序列不检索休眠当前插入值(Oracle sequence for a prim

2019-10-17 09:36发布

我有下面的代码试图对主键列取所生成的序列值COUNTRY_ID所述的COUNTRY表中我的Oracle(10克)的数据库。

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_ID在Oracle表列,插入的值是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>

我缺少的是在这里吗?

Answer 1:

我确实有对触发COUNTRY这是自动由一个Oracle GUI工具创建的顺序与主键列关联表COUNTRY_ID

该序列被Hibernate和再次被触发执行一次两次。 我暂时禁用触发器和按预期的方式工作。



文章来源: Oracle sequence for a primary key field doesn't retrieve the currently inserted value in Hibernate