简体   繁体   English

Spring Boot 中的处理程序方法正在保存新记录,而不是更新数据库中已存在的记录以进行 put 请求

[英]handler method in spring boot is saving new record instead of updating already existed record in database for put request

I am trying to update an existing record in my database for a put request in spring boot.我正在尝试更新我的数据库中的现有记录,以便在 Spring Boot 中进行放置请求。

Incoming Request -传入请求 -

在此处输入图像描述

Handler method in controller class控制器类中的处理程序方法

  // put method for updating record
    @PutMapping("/accounts/{id}")
    public Account putAccount(@RequestBody Account account, @PathVariable("id") int id) {
        System.out.println(account);
        Account ac = this.accountServices.addAccount(account);
        // save method of crud repository also updates if data is already present
        return ac;
    }

AccountServices class addAccount() method AccountServices 类 addAccount() 方法

// add an account
    public Account addAccount(Account account) {
        Account acc = this.accountRepository.save(account);
        return acc;
    }

AccountRepository interface AccountRepository 接口

public interface AccountRepository extends CrudRepository<Account, Integer> {
//custom finder method to get book record with id
}

For every request it is adding new record instead of updating already existing record.对于每个请求,它都会添加新记录而不是更新现有记录。 Someone please help here.有人请在这里帮忙。

Adding Account class添加帐户类

@Entity
@Table(name = "Account")
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int accountNumber;
    public String accountType;
    public int balance;

    @ManyToMany(cascade = CascadeType.ALL)
    @JsonManagedReference
    @JsonIgnore 
    private List<Customer> customers;
//skipped constructors, getters and setters
}

似乎您的模型的 ORM 映射会为每个save操作生成模型对象的 ID(例如@Generated Value(strategy = GenerationType.IDENTITY) ),并且在这种情况下save()不会更新记录。

You need to make sure your Account object have ID in it before you save, If ID is null for the object you're going to save, It'll be saved as new entry.在保存之前,您需要确保您的 Account 对象中有 ID,如果您要保存的对象的 ID 为空,它将被保存为新条目。

In your controller you can do this -在您的控制器中,您可以执行此操作 -

@PutMapping("/accounts/{id}")
public Account putAccount(@RequestBody Account account, @PathVariable("id") int id) {
    System.out.println(account);
    account.setId(id);
    Account ac = this.accountServices.addAccount(account);
    // save method of crud repository also updates if data is already present
    return ac;
}

Maybe you can try something like that也许你可以尝试类似的东西

private void _setPackAddress(Pack objectPack, Pack pacDao) {
        if (objectPack.getPackageAddress() != null) {
            pacDao.getPackageAddress().setCity(objectPack.getPackageAddress().getCity());
            pacDao.getPackageAddress().setNumber(objectPack.getPackageAddress().getNumber());
            pacDao.getPackageAddress().setPostalCode(objectPack.getPackageAddress().getPostalCode());
            pacDao.getPackageAddress().setStreet(objectPack.getPackageAddress().getStreet());
            
        }
}

And where can you see from where parameters come从哪里可以看出参数来自哪里

        Pack pacDao = this.packRepository.findById(id).orElseThrow(() -> new OpenApiResourceNotFoundException("Pack not found:: " + id));

not directly like that不直接那样

private void _setPackAddress(Pack objectPack, Pack pacDao) {
 if (objectPack.getPackageAddress() != null) {
    pacDao.setPackageAddress(objectPack.getPackageAddress());
 }
}

I also encountered this problem, but I solved it that way.我也遇到了这个问题,但我是这样解决的。 I hope this post to be helpful for you.我希望这篇文章对你有所帮助。 Keep coding :-)继续编码:-)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM