我有以下代码,尝试为Oracle(10g)数据库COUNTRY_ID中的COUNTRY表的主键列获取生成的序列值。
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());代码中的该语句尝试在插入完成后显示当前生成的序列值。
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)。
426
425
据推测,由于某种原因,该序列似乎执行了两次 。
在我的Hibernate POJO中,我将countryId主键列指定如下,
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的映射如下。
Country.hbm.xml
<id name="countryId" type="long"> <column name="COUNTRY_ID" precision="35" scale="0"/> <generator class="sequence"> <param name="sequence">COUNTRY_SEQ</param> </generator> </id>
我在这里想念什么?
我确实有一个针对该COUNTRY表的触发器,该表是由Oracle GUI工具自动创建的,用于将序列与主键列相关联COUNTRY_ID。
该序列由Hibernate一次执行两次,然后由触发器执行一次。我暂时禁用了触发器,该方法按预期工作。