提问人:ssnyc 提问时间:11/15/2023 更新时间:11/15/2023 访问量:25
尝试通过 Spring data jpa 更新 oracle db 中的值
Trying to update values in oracle db through Spring data jpa
问:
我正在尝试编写接受对象的代码,如果它已存在于数据库中,则更新映射到该对象 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 是一个字符串?
答:
你说:
这是我的更新测试用例(我从数据库中获得了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);
}
评论