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

标签 java spring oracle hibernate persistence

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

我使用 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/

相关文章:

java - .foreach 和 .stream().foreach 有什么区别?

spring - @ContextConfiguration如何同时使用基于XML的配置和基于Java的配置?

sql - 为什么 SQL 连接在 Oracle 中失败?

不带参数的 Oracle 函数

java - 检测文件何时保存

java - 核心java打印蝴蝶结构

java - 检查中间字符串是否以某种模式开始和结束并更新该字符串

java - gradle + spring MVC + spring boot + jsp = 404错误?

java - 所有方法的 Spring ModelMap 对象

Oracle分组依据,从非分组列中获取第一个元素