首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring Data JPA + Oracle触发器将ID递增两次

Spring Data JPA + Oracle触发器将ID递增两次
EN

Stack Overflow用户
提问于 2018-12-13 23:36:48
回答 1查看 892关注 0票数 1

我使用以下技术堆栈:

用于连接池的

  • spring-boot-starter-data-jpa
  • HikariCP
  • Oracle DB

我的实际代码如下所示。

代码语言:javascript
复制
   /// 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“表中插入记录的ID为'58497‘时,repository.save()返回了一个不同的值。当我在FILE_ID为'58496‘的表"ACCESS_CONTROL_FILE“上进行第二次插入时,会导致下面的错误,因为ID为'58496’的文件不存在。

原因: java.sql.SQLIntegrityConstraintViolationException: ORA-01400:无法在("DB_OWNER"."ACCESS_CONTROL_FILE"."FILE_ID")中插入NULL

我不明白为什么repository.save()会返回一个与数据库中实际插入的ID(即ID=58496)不同的ID(即ID=58497)!

我研究了所有我能在互联网上找到的与“传播与隔离”相关的选项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-14 01:09:53

正如评论中提到的,看起来是数据库触发器导致了这个问题。禁用触发器,让JPA管理ID生成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53765290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档