我在使用 JPA 的 Oracle 中遇到自动增量 ID 的问题。如果我使用这样的序列:
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "customerSequence")
@SequenceGenerator(name = "customerSequence", sequenceName = "CUSTOMER_SEQ")
private int id;
// getters and setters
}
我必须一直使用序列。例如,如果 DBA 在执行这样的 INSERT 时不使用它并提供实际的 id 值:
INSERT INTO CUSTOMER (ID, NAME) VALUES (1, 'Paul');
INSERT INTO CUSTOMER (ID, NAME) VALUES (2, 'John');
INSERT INTO CUSTOMER (ID, NAME) VALUES (3, 'Mark');
// bunch of other statements like this
然后序列值保持为 0。因此CUSTOMER_SEQ.NEXTVAL
返回实际上已经在数据库中的 1。
我需要实现灵活性的最佳方式。当提供 id 时,序列应该递增,这样数字就不会发生冲突。
PS我尝试使用这样的触发器:
CREATE OR REPLACE
TRIGGER CUSTOMER_INSERT
BEFORE INSERT ON "CUSTOMER"
FOR EACH ROW
DECLARE
MAX_ID NUMBER;
CURRENT_SEQ_VAL NUMBER;
BEGIN
IF :NEW.ID IS NULL THEN
SELECT CUSTOMER_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
ELSE
SELECT GREATEST(NVL(MAX(ID), 0), :NEW.ID) INTO MAX_ID FROM "CUSTOMER";
SELECT CUSTOMER_SEQ.NEXTVAL INTO CURRENT_SEQ_VAL FROM DUAL;
WHILE CURRENT_SEQ_VAL < MAX_ID
LOOP
SELECT CUSTOMER_SEQ.NEXTVAL INTO CURRENT_SEQ_VAL FROM DUAL;
END LOOP;
END IF;
END;
当我使用原始 SQL 进行插入时,它工作正常,但是当我使用 JPA 时,有时我会得到太大的 id,有时会出现像这两个这样的奇怪错误:
ORA-04091: table CUSTOMER is mutating, trigger/function may not see it
ORA-04088: error during execution of trigger 'CUSTOMER_INSERT'
可能我在这里做错了什么。有人可以帮我找到解决方案吗?