0

我需要有关在使用触发器和序列进行 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 属性中传递空值,以便在 ID 为空时使用数据库序列获取下一个值的数据库触发器在数据库记录中分配 PK 值。

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

如果这是不可能的,我应该尝试什么其他方法?

谢谢你的帮助。

更新

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

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

2 回答 2

0

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

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

如果不先创建。

或者在应用程序中添加以下属性,但这不是一个好习惯。

spring.jpa.hibernate.ddl-auto = update
于 2021-07-07T08:35:49.633 回答
0

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

于 2021-07-12T19:46:21.040 回答