sequencegenerator生成的主键写入数据库不正确

Primary keys generated by sequencegenerator are written into database incorrectly

我注意到我正在编写的应用程序出现了一个奇怪的问题。

我使用 Hibernate、Spring 和 Oracle 数据库。数据库中有一个Orders table,它的PK是由一个序列生成的。我在应用程序中定义如下:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_ORDER_ID")
@SequenceGenerator(name="SEQ_ORDER_ID", sequenceName="SEQ_ORDER_ID", allocationSize=1)
@Column(name = "ID_ORDER", length = 10, nullable = false)

为了将订单保存到数据库中,我创建了一个新订单 Order order = new Order();,设置其值并使用 session.persist(order).

现在,Order 对象生成了正确的主键,比方说 120,而之前的主键是 119,但是当我查看数据库时,新创建的订单行具有主键键值 121。我使用调试并完成了创建订单的过程,这就是我获得这些值的方式。

如果我尝试直接在 sqldeveloper 中创建一个新订单,序列会正常工作并且值会递增 1。

每次插入都会发生这种情况,而不仅仅是订单。写入数据库的主键值始终是+2而不是+1。

所有 Oracle 序列都具有 INCREMENT_BY1

我尝试在 persist 后添加 sessionFactory.getCurrentSession().flush();,但没有任何变化。

有没有人遇到过这种情况?您知道我在这里可能做错了什么导致了这种行为吗?

感谢大家给我指明了正确的方向!

问题出在我的数据库中生成新 ID 的触发器中,即使一个是从应用程序发送的。我必须在触发器的 BEGIN 之前添加 WHEN (NEW.ID_ORDER is NULL) 才能解决此问题。

根据这个答案:HIbernate issue with Oracle Trigger for generating id from a sequence