有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Autoincrement最佳实践JPA Oracle DB

我对Oracle中使用JPA的自动增量ID有问题。如果我使用这样的序列:

public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "customerSequence")
    @SequenceGenerator(name = "customerSequence", sequenceName = "CUSTOMER_SEQ")
    private int id;

    // getters and setters
}

我必须一直使用序列。例如,如果DBA不使用它,并在执行以下插入时提供实际的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时,序列应该递增,这样数字就不会冲突

另外,我试着使用这样的触发器:

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' 

也许我做错了什么。有人能帮我找到解决办法吗


共 (0) 个答案