gpt4 book ai didi

java - 由sequencegenerator生成的主键错误地写入数据库

转载 作者:行者123 更新时间:2023-11-30 06:45:38 27 4
gpt4 key购买 nike

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

我使用 Hibernate、Spring 和 Oracle 数据库。数据库中有一个Orders表,它的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 序列都有 INCRMENT_BY1

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

有人有过这样的经历吗?您知道我在这里可能做错了什么导致这种行为吗?

最佳答案

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

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

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

关于java - 由sequencegenerator生成的主键错误地写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724864/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com