【问题标题】:Sprint Boot JPA won't update record with save methodSpring Boot JPA 不会使用保存方法更新记录
【发布时间】:2016-02-09 17:40:16
【问题描述】:

我对 Spring Boot 和 JPA 比较陌生,正在尝试更新 mysql 数据库中的记录。在下面的控制器中,我能够成功地将新记录保存到数据库中并查找现有记录。但是,当我尝试更新现有记录时,没有任何反应。 (如,它不保存并跳过该方法。)

下面是我的控制器。请注意,errorUpdateService.fineErrorByName 可以成功检索数据库中的现有记录。

@Autowired
private ErrorUpdateService errorUpdateService;


@RequestMapping(value="/api/UpdateError", method=RequestMethod.POST)
@ResponseBody
public String updateError(@RequestBody Error error){
    try{
        Error retrievedError=errorUpdateService.findErrorByName((error.getName()));
        if(!retrievedError.getName().equals("NVE")){
            System.out.println("Here is error: "+retrievedError.toString());
            errorUpdateService.updateError(retrievedError);
            return retrievedError.getName() + " has been updated";
        }
    }catch(NullPointerException e){
        errorUpdateService.updateError(error);
        return "Error Name Does not Exist.  Saving " +error.getName() ;
    }
    return "Failed Method";
}

当代码执行到errorUpdateService.updateError(retrievedError); 时,它不会保存到数据库中并且似乎会跳过。但是,如果您发送数据库中不存在的记录,则不会出现任何问题(请参阅 Null Pointer catch 块)。

请参阅下面的 ErrorUpdateServiceImpl '

@Autowired
private ErrorRepository errorRepository;

@Override
public void updateError(Error error) {
    System.out.println("Attempting to save a error: "+error.toString());
    errorRepository.save(error);
}

@Override
public Error findErrorByName(String errName){

    try{
        Error error=errorRepository.findByErrName(errName);

        return error;
    }catch(NullPointerException e){
        return new Error("NVE");
    }   
}

'

public interface ErrorRepository extends JpaRepository<Error, Long>{

    Error findByErrName(String errName);
}

以下是尝试更新记录时的控制台输出示例:

Hibernate: select error0_.id as id1_0_, error0_.documentationurl as document2_0_, error0_.err_name as err_name3_0_, error0_.error_id as error_id4_0_, error0_.has_documentation as has_docu5_0_, error0_.last_incident_time as last_inc6_0_, error0_.throttle_minutes as throttle7_0_, error0_.throttle_threshold as throttle8_0_ from error error0_ where error0_.err_name=?
Here is error: Error [id=6, errorId=0, hasDocumentation=false, errName=Error0001, documentationURL=null, throttleThreshold=0, throttleMinutes=0, lastIncidentTime=null]
Attempting to save a error: Error [id=6, errorId=0, hasDocumentation=false, errName=Error0001, documentationURL=null, throttleThreshold=0, throttleMinutes=0, lastIncidentTime=null]

【问题讨论】:

  • 在旁注中,您不应该看到NullPointerExceptions..
  • 所以您使用NullPointerException 捕捉来避免对retrievedError 的空值检查?只是在一个条件下做,伙计。关于您的问题,当您尝试更新时,Hibernate 是否会抛出任何特定异常?
  • 捕获并处理异常,不要将它们转换为一些特殊的对象。为什么你期望findByErrName 抛出 NullPointerException?

标签: java spring-boot spring-data spring-data-jpa


【解决方案1】:

我是否遗漏了某些内容,或者您​​正在尝试使用您检索到的相同记录来更新记录?您正在使用完全相同的值对其进行更新,所以也许这就是您看不到任何更改的原因?

【讨论】:

  • 哇,你完全正确。我不敢相信我错过了。非常感谢您查看:)
  • 没问题!很高兴只是这样,而不是无法检测到的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2020-01-21
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多