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_BY
值 1
。
我尝试在 persist 后添加 sessionFactory.getCurrentSession().flush();
,但没有任何变化。
有没有人遇到过这种情况?您知道我在这里可能做错了什么导致了这种行为吗?
感谢大家给我指明了正确的方向!
问题出在我的数据库中生成新 ID 的触发器中,即使一个是从应用程序发送的。我必须在触发器的 BEGIN
之前添加 WHEN (NEW.ID_ORDER is NULL)
才能解决此问题。
根据这个答案:HIbernate issue with Oracle Trigger for generating id from a sequence
我注意到我正在编写的应用程序出现了一个奇怪的问题。
我使用 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_BY
值 1
。
我尝试在 persist 后添加 sessionFactory.getCurrentSession().flush();
,但没有任何变化。
有没有人遇到过这种情况?您知道我在这里可能做错了什么导致了这种行为吗?
感谢大家给我指明了正确的方向!
问题出在我的数据库中生成新 ID 的触发器中,即使一个是从应用程序发送的。我必须在触发器的 BEGIN
之前添加 WHEN (NEW.ID_ORDER is NULL)
才能解决此问题。
根据这个答案:HIbernate issue with Oracle Trigger for generating id from a sequence