我注意到我正在编写的应用程序发生了一个奇怪的问题。
我使用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
。我使用了debug并完成了创建Order的过程,这就是我获取这些值的过程。
如果我尝试直接在sqldeveloper中创建新订单,则序列正常工作,值递增1。
每次插入都会发生这种情况,而不仅仅是订单。写入数据库的主键值始终为+2而不是+1。
所有Oracle序列都具有INCREMENT_BY
值1
。
我尝试在持久化之后添加sessionFactory.getCurrentSession().flush();
,但没有任何变化。
有没有人经历过这个?你知道我在这里做错了会导致这种行为吗?
答案 0 :(得分:1)
感谢大家指点我正确的方向!
问题在于我的数据库中的触发器生成新ID,即使从应用程序发送了一个ID。我必须在触发器WHEN (NEW.ID_ORDER is NULL)
之前添加BEGIN
来解决此问题。
根据这个答案:HIbernate issue with Oracle Trigger for generating id from a sequence