Spring Data JPA + Oracle Trigger увеличивает идентификатор в два раза - PullRequest
0 голосов
/ 13 декабря 2018

Я использую следующий технический стек:

  • spring-boot-starter-data-jpa
  • HikariCP для пула соединений
  • Oracle DB

Мой настоящий код выглядит примерно так:

   /// My trigger looks like this
   CREATE OR REPLACE TRIGGER FILE_BRI
     BEFORE INSERT
     ON FILE
     FOR EACH ROW
     BEGIN
       SELECT FILE_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
     END;
   ///

   public class FILE implements Serializable {
          @Id
        @SequenceGenerator(
                name = "FILE_SEQ",
                sequenceName = "FILE_SEQ",
                allocationSize = 1)
        @GeneratedValue(
                strategy = GenerationType.SEQUENCE,
                generator = "FILE_SEQ"
        )
        private long id;
    }

    public class ServiceA () {

        @Transactional(propagation = REQUIRES_NEW, isolation = READ_COMMITTED) 
        public File insertFile() {
         // Below line returns the inserted File object with ID as '58496'
           return fileRepository.save(file)
        }

        @Transactional(propagation = REQUIRES_NEW, isolation = READ_COMMITTED) 
        public AccessControl insertAccessControl() {
        // Below line results in 'SQLIntegrityConstraintViolationException' (full error at the bottom of this post)
            return accessControlRepository.save(accessControlFile)
         }
     }

     Public class FileProcessor() {
       ServiceA serviceA;
       public void someMethod() {
         // insert the file and get the inserted record
           File insertedFile = serviceA.insertFile(file);

         // get the ID from the inserted file and make another insert into another table
           serviceA.insertAccessControl(insertedFile.getId()); // inserted file ID is '58496'
        }
     }

Это мое расследование:

Когда я проверил идентификатор вставленной записи вТаблица "FILE" - это "58497", однако repository.save() вернул другое значение.Когда я выполняю вторую вставку в таблицу «ACCESS_CONTROL_FILE» с FILE_ID в качестве «58496», это приводит к ошибке, указанной ниже, поскольку ФАЙЛ с идентификатором «58496» не существует.

Причина:java.sql.SQLIntegrityConstraintViolationException: ORA-01400: невозможно вставить NULL в ("DB_OWNER". "ACCESS_CONTROL_FILE". "FILE_ID")

Я озадачен, почему repository.save() возвращает другоеID (т.е. ID = 58496), чем то, что фактически вставлено (ID = 58497) в базу данных!

Я исследовал все варианты, которые я мог найти в Интернете, связанные с «Распространением и изоляцией».

1 Ответ

0 голосов
/ 13 декабря 2018

Как уже упоминалось в комментариях, похоже, что триггер базы данных вызывает проблему.Отключите триггер, чтобы JPA управляла генерацией идентификатора.

...