我有以下代码尝试获取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>
我在这里缺少什么?
答案 0 :(得分:0)
我确实有一个针对COUNTRY
表的触发器,该表由Oracle GUI工具自动创建,以将序列与主键列COUNTRY_ID
相关联。
序列由Hibernate执行两次,再次由触发器执行。我暂时禁用了触发器,方法按预期工作。