尝试通过 Spring data jpa 更新 oracle db 中的值

Trying to update values in oracle db through Spring data jpa

提问人:ssnyc 提问时间:11/15/2023 更新时间:11/15/2023 访问量:25

问:

我正在尝试编写接受对象的代码,如果它已存在于数据库中,则更新映射到该对象 ID 的行中的一些值。它可以在表中插入新行,但是当我想更新一行时,出现以下错误:

原因:org.springframework.dao.IncorrectUpdateSemanticsDataAccessException:无法更新实体 [Video(videoId=10,30,35,112,-127,-72,79,-71,-32,99,116,-77,90,10,-28,-23, name=Test Name 1, description=Test Description, tags=Test Tag, url=Test url, active=1, createdBy=testcreator, createdDate=2023-11-14 13:55:24.682, updatedBy=testupdator, updatedDate=Tue Nov 14 17:30:00 GMT 2023)];在数据库中找不到 ID [10,30,35,112,-127,-72,79,-71,-32,99,116,-77,90,10,-28,-23]

这是我的 serviceImpl 的代码

public Video insertVideoInDB(Video newVideo){
        Date date = new Date();
        //check if this is an update
        if(newVideo.getVideoId() != null){
            Video existingVideo = videoRepository.findById(newVideo.getVideoId()).get();
            //then update the updated date and updated by and whatever else changed
            existingVideo.setUpdatedBy(newVideo.getUpdatedBy());
            existingVideo.setUpdatedDate(date);
            return videoRepository.save(existingVideo);
        }
        //new video
        else{
            newVideo.setCreatedDate(date);
            newVideo.setUpdatedDate(date);
        }
        return videoRepository.save(newVideo);
    }

这是我的更新测试用例(我从数据库中获得了id,因为我已经在表中插入了一个视频)

@Test
    void testUpdates(){
        Video video = new Video(
                "0A1E237081B84FB9E06374B35A0AE4E9", //id
                "Updating", //name
                "Test Description",  //desc
                "Test Tag",  //tags
                "Test url",  //url
                1,           //status
                "testcreator", //who created
                null,      //date created
                "new updater", //who updated -----only val i change here to test
                null //date updated
        );
        videoServiceImpl.insertVideoInDB(video);

    }

我正在使用 sys_guid() 在表中生成 id。我能够打印出表中的现有视频对象并且 ID 匹配,但我想知道这个问题是否可能是由于 sys_guid 创建的 ID 是 RAW,而我视频对象中的 ID 是一个字符串?

Java Spring Oracle spring-boot jpa

评论

0赞 Tim Biegeleisen 11/15/2023
旁注:我们通常不会对数据库进行单元测试。实际上,您在这里尝试的严格是集成测试。

答:

0赞 Tim Biegeleisen 11/15/2023 #1

你说:

这是我的更新测试用例(我从数据库中获得了id,因为我已经在表中插入了一个视频)

实际上,在调用测试方法之前,您从未将实体保存在数据库中,但您确实手动分配了一个 ID。因此,使用手动 ID 针对基础表查找此实体将失败。

正确的测试用例不会分配任何 ID,因为实体尚未保存:

@Test
void testUpdates() {
    Video video = new Video(
            null,
            "Updating", //name
            "Test Description",  //desc
            "Test Tag",  //tags
            "Test url",  //url
            1,           //status
            "testcreator", //who created
            null,      //date created
            "new updater", //who updated -----only val i change here to test
            null //date updated
    );
    videoServiceImpl.insertVideoInDB(video);
}