【问题标题】:How to solve the value of not null in database when JPA is updating?JPA更新时数据库中not null的值如何解决?
【发布时间】:2020-01-31 01:02:41
【问题描述】:
CREATE TABLE `user_info` (
`user_info_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nickname` varchar(40) NOT NULL,
`email` varchar(100) 
)

这是我的数据库表,数据库有A记录id=1,昵称=test,email=null

UserInfo info = new UserInfo();
info.setUserInfoId(1);
info.setEmail("hello@hotmail.com");

当我用上面的代码更新时,出现一个错误Column 'nickname' cannot be null!

我知道这是因为 JPA 必须先执行查找,但我不想在更新操作时给 JPA 所有不能为空的值。

补充说明:

假设我的前端只向我发送 ID 和电子邮件,我该如何更新它?使用 SQL 可行,但 JPA 必须要求昵称不能为空

如何解决这个问题? 谢谢

【问题讨论】:

  • 你显示的不是更新操作。
  • 我的错误。我添加了一些描述。
  • 如果您需要更新现有实体实例,请按照 David Conrad 下面的建议检索记录。
  • 这确实是一个关于修补现有实体的问题。除了我在下面的评论之外,我还遇到了:cassiomolin.com/2019/06/10/using-http-patch-in-spring

标签: java spring-data-jpa


【解决方案1】:

更新现有记录的方法是加载记录,更新任何需要更新的列,然后通过创建新对象来保存它,不是

UserInfo info = userInfoRepository.findById(1);
info.setEmail("hello@hotmail.com");
userInfoRepository.save(info);

【讨论】:

  • 在 JPA 中,不需要显式保存。
  • 假设我的前端只给我发ID和email,我该如何更新呢?使用 SQL 是可行的,但 JPA 必须要求昵称不能为空
  • 您需要自己处理。假设您有一个 Spring MVC 控制器来处理请求,那么我上次查看时不支持补丁操作,即部分更新。但是 Spring Data Rest 扩展确实如此。进一步了解:stackoverflow.com/questions/37681555/…。因此,一种选择是删除您的控制器并将 SDR 自动生成的 endpint 用于基本 CRUD。
  • @BOOOMr.Z 您只需要 ID 和电子邮件。您通过 ID 查找现有记录,设置电子邮件,然后保存它。它上面已经有昵称了。
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多