在触发器中使用 Oracle DB 序列的带有 Pk 的 Spring Boot 实体

问题描述

我需要帮助将实体持久化到使用触发器和序列进行 PK 的 Oracle DB 表中。 到目前为止,我从其他 stackoverflow 问题中尝试了这些:

@Id 
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment",strategy="increment")

这种方法有效。它找到 PK 的最大值并将该值增加 1。但是,这不会更新 Db 序列,从而在某些时候导致“违反约束”错误

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="id_sequence")
@SequenceGenerator(name="id_sequence",sequenceName="MY_DB_SEQ")

这种方法对我也不起作用。遗憾的是,当 Db 序列尝试在内部运行“select MY_DB_SEQ.nextval from dual”时,它无法访问并导致错误。为什么不能访问?去问问数据库管理员:)

看起来我唯一的选择是在实体 PK 属性中传递 null,以便 DB 触发器在 ID 为 null 时使用 DB 序列获取 nextval,在 DB 记录中分配 PK 值。

如何为@Id 传递空值?当然,这是抛出错误,因为需要。我可以使用其他任何注释吗?

如果这是不可能的,我应该尝试哪些其他方法

感谢您的帮助。

更新

我找不到另一种方法,有一个用户无法访问的 DB Seq,并且当它需要将 NULL 传递给 PK 以便让 DB 使用检查 PK 中的 NULL 值的触发器来运行 seq下一个。 授予对 DB Seq 的访问权限后,这种方法当然有效。

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE,sequenceName="MY_DB_SEQ")

解决方法

您是否在数据库中创建了如下序列?

CREATE SEQUENCE id_seq INCREMENT BY 1 START WITH 0 MINVALUE 0 MAXVALUE 100 NOCYCLE NOCACHE;

如果不是先创建。

或者在应用程序中添加以下属性,但这不是好的做法。

spring.jpa.hibernate.ddl-auto = update
,

截至目前,我找不到任何解决方案将 NULL 传递给实体中的 PK。 在 DB 中,DB 序列被授予访问权限。 Spring Boot 现在可以读取序列并生成下一个值。