问题描述
我需要帮助将实体持久化到使用触发器和序列进行 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 现在可以读取序列并生成下一个值。