Spring boot 它是使用现有数据插入的。为什么要创建新行?

Spring boot 它是使用现有数据插入的。为什么要创建新行?,spring-boot,vue.js,jpa,spring-data-jpa,Spring Boot,Vue.js,Jpa,Spring Data Jpa,我正在尝试从现有表中获取数据。但是,当我更新它时,它会创建一个包含该数据的新行 下面是源代码 (ProductInfo--JPA) (用户——JPA) 例如,我在所选产品中选择了一个名为test1的用户,我只想添加该用户的用户名。运行代码将创建一个新行,其中用户拥有test1的原始行,用户名test1,其余数据为null 问题是什么?确保productInfo.getUser()设置了identity即它的id映射到了表,否则hibernate不知道user对象是新的还是旧的。在productI

我正在尝试从现有表中获取数据。但是,当我更新它时,它会创建一个包含该数据的新行

下面是源代码

(ProductInfo--JPA)

(用户——JPA)

例如,我在所选产品中选择了一个名为test1的用户,我只想添加该用户的用户名。运行代码将创建一个新行,其中用户拥有test1的原始行,用户名test1,其余数据为null


问题是什么?

确保
productInfo.getUser()
设置了
identity
即它的id映射到了表,否则hibernate不知道
user
对象是新的还是旧的。

在productInfo表的源中,public user getUser(){return user;}public void setUser(User User){this.User=User;}有。你在谈论这个吗?你能详细解释一下吗?检查这个块
\u ProductInfo.setUser(ProductInfo.getUser())
此处
productInfo
是正在提交的数据,如果从此处返回的用户没有映射到用户表的id,则hibernate或JPA不知道它是新实体或现有实体,如果缺少id,则假定它是对象的新实例并创建新记录。我解决了此问题。谢谢!
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;

public ProductInfo() {

}

public ProductInfo(String productType, String productSize, String productBios, String productCpu, String productDate, String productFac, String productHdd, String productNum, String productOs, String productRam, String productResolution, String productSn, String productSsd, String productSsdType, String productSecurity, boolean productUseYn) {
    this.productType = productType;
    this.productBios = productBios;
    this.productCpu = productCpu;
    this.productDate = productDate;
    this.productFac = productFac;
    this.productHdd = productHdd;
    this.productNum = productNum;
    this.productOs = productOs;
    this.productRam = productRam;
    this.productResolution = productResolution;
    this.productSn = productSn;
    this.productSsd = productSsd;
    this.productSsdType = productSsdType;
    this.productSecurity = productSecurity;
    this.productUseYn = productUseYn;
    this.productSize = productSize;

}
@OneToMany(cascade = CascadeType.ALL)
private Set<ProductInfo> productInfos = new HashSet<>();

public User() {
}

public User(String username, String email, String password, boolean delYn) {
    this.username = username;
    this.email = email;
    this.password = password;
    this.delYn = delYn;
}
@PutMapping(value = {"/products/{id}", "/productSetting/{id}", "/productList/{id}"})
public ResponseEntity<ProductInfo> updateUser(@PathVariable("id") long id, @RequestBody ProductInfo productInfo) {
  Optional<ProductInfo> productData = productInfoRepository.findById(id);

  if (productData.isPresent()) {
    ProductInfo _ProductInfo = productData.get();
    _ProductInfo.setUser(productInfo.getUser());
    _ProductInfo.setProductType(productInfo.getProductType());
    _ProductInfo.setProductSize(productInfo.getProductSize());
    _ProductInfo.setProductBios(productInfo.getProductBios());
    _ProductInfo.setProductCpu(productInfo.getProductCpu());
    _ProductInfo.setProductDate(productInfo.getProductDate());
    _ProductInfo.setProductFac(productInfo.getProductFac());
    _ProductInfo.setProductHdd(productInfo.getProductHdd());
    _ProductInfo.setProductNum(productInfo.getProductNum());
    _ProductInfo.setProductOs(productInfo.getProductOs());
    _ProductInfo.setProductRam(productInfo.getProductRam());
    _ProductInfo.setProductResolution(productInfo.getProductResolution());
    _ProductInfo.setProductSecurity(productInfo.getProductSecurity());
    _ProductInfo.setProductSn(productInfo.getProductSn());
    _ProductInfo.setProductSsd(productInfo.getProductSsd());
    _ProductInfo.setProductSsdType(productInfo.getProductSsdType());
    _ProductInfo.setProductUseYn(productInfo.isProductUseYn());
    return new ResponseEntity<>(productInfoRepository.save(_ProductInfo), HttpStatus.OK);
  } else {
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  }
}
updateProductUserAdd(status) {
  var data = {
    id:this.currentProductInfo.id,
    productUseYn: status,
    user: {
      username: this.currentUser.username
    }
  };
  ProductInfoDataService.update(this.currentProductInfo.id, data, {id: this.currentUser.id, data})
    .then(response => {
      this.currentProductInfo = response.data;
      this.currentProductInfo = status;
      console.log(this.currentProductInfo);
      console.log(response.data)
    })
    .catch(e => {
      console.log(e);
    });
},