我注意到我正在编写的应用程序发生了一个奇怪的问题。
我使用 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_BY
值 1
。
我尝试在持久后添加 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/